Я использовал MSMQ прежде и единственный объект, который я добавил бы к Вашему списку, необходимая как условие проверка на управление версиями. Я столкнулся с проблемой, где один сайт имел Сервер Win 2000 и поэтому MSMQ v.2, по сравнению с Сервером Win 2003 и MSMQ v3. Весь мой код.NET предназначался для v.3, и они не совместимы... или по крайней мере не легко так.
Просто соображение, если Вы идете путем MSMQ.
Один раз у вас есть MethodInfo через Reflection, вы можете использовать Delegate.CreateDelegate , чтобы превратить его в делегата, а затем использовать Reflection, чтобы установить это непосредственно для свойства / поля вашей структуры.
Вы можете создать делегата, который вызывает ваш отраженный метод во время выполнения, используя Invoke или Delegate.CreateDelegate.
Пример:
using System;
class Program
{
public delegate void TestMethod();
public class Test
{
public void MyMethod()
{
Console.WriteLine("Test");
}
}
static void Main(string[] args)
{
Test t = new Test();
Type test = t.GetType();
var reflectedMethod = test.GetMethod("MyMethod");
TestMethod method = (TestMethod)Delegate.CreateDelegate(typeof(TestMethod), t, reflectedMethod);
method();
}
}
Также вам нужен подходящий делегат, который уже будет объявлен
В качестве примера:
using System;
using System.Linq;
using System.Reflection;
public delegate void TestMethod();
class FooAttribute : Attribute { }
static class Program
{
static void Main() {
// find by attribute
MethodInfo method =
(from m in typeof(Program).GetMethods()
where Attribute.IsDefined(m, typeof(FooAttribute))
select m).First();
TestMethod del = (TestMethod)Delegate.CreateDelegate(
typeof(TestMethod), method);
TestMetaData tmd = new TestMetaData(del, method.Name);
tmd.Bar();
}
[Foo]
public static void TestImpl() {
Console.WriteLine("hi");
}
}
struct TestMetaData
{
public TestMetaData(TestMethod method, string name)
{
this.method = method;
this.testName = name;
}
readonly TestMethod method;
readonly string testName;
public void Bar() { method(); }
}