Как я могу передать метод, полученный отражением в C# к методу, который принимает метод как делегата?

Я использовал MSMQ прежде и единственный объект, который я добавил бы к Вашему списку, необходимая как условие проверка на управление версиями. Я столкнулся с проблемой, где один сайт имел Сервер Win 2000 и поэтому MSMQ v.2, по сравнению с Сервером Win 2003 и MSMQ v3. Весь мой код.NET предназначался для v.3, и они не совместимы... или по крайней мере не легко так.

Просто соображение, если Вы идете путем MSMQ.

6
задан mdb 26 October 2009 в 17:35
поделиться

4 ответа

Один раз у вас есть MethodInfo через Reflection, вы можете использовать Delegate.CreateDelegate , чтобы превратить его в делегата, а затем использовать Reflection, чтобы установить это непосредственно для свойства / поля вашей структуры.

11
ответ дан 9 December 2019 в 20:45
поделиться

Вы можете создать делегата, который вызывает ваш отраженный метод во время выполнения, используя 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();
    }
}
1
ответ дан 9 December 2019 в 20:45
поделиться

Также вам нужен подходящий делегат, который уже будет объявлен

0
ответ дан 9 December 2019 в 20:45
поделиться

В качестве примера:

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(); }
}
0
ответ дан 9 December 2019 в 20:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: