c#反射委托异常:必须从委托派生

本文关键字:派生 异常 反射 | 更新日期: 2023-09-27 17:53:55

我试图理解委托,所以我只是写了一个小的尝试项目;我有D类:

class D
{
    private static void Func1(Object o)
    {
        if (!(o is string)) return;
        string s = o as string;
        Console.WriteLine("Func1 going to sleep");
        Thread.Sleep(1500);
        Console.WriteLine("Func1: " + s);
    }
}

,主要使用:

 MethodInfo inf = typeof(D).GetMethod("Func1", BindingFlags.NonPublic | BindingFlags.Static);
 Delegate d = Delegate.CreateDelegate(typeof(D), inf);

方法info获得了正确的信息,但是CreateDelegate方法抛出了一个异常,说该类型必须派生自Delegate。

我该如何解决这个问题?

c#反射委托异常:必须从委托派生

如果您想为Func1方法创建一个委托,您需要指定要创建的委托的类型。在这种情况下,您可以使用Action<object>:

MethodInfo inf = typeof(D).GetMethod("Func1", BindingFlags.NonPublic | BindingFlags.Static);
Delegate d = Delegate.CreateDelegate(typeof(Action<object>), inf);

传递给CreateDelegate方法的类型实际上不是类的类型,而是您将用于调用该方法的函数的类型。因此,它将是具有与原始方法相同参数的委托类型:

public delegate void MyDelegate(Object o);
...
MethodInfo inf = typeof(D).GetMethod("Func1", BindingFlags.NonPublic | BindingFlags.Static);
Delegate d = Delegate.CreateDelegate(typeof(MyDelegate), inf);