如何找出 delegate return void ?

how find out delegate return void ?

我想知道当前的代表签名。

特别是我想分类 "Action" 和 "Func" deleagte。

比如,如果当前委托是动作,运行 动作和 return 当前值,

and if func, 运行 func and return func.

结果

要检查委托returns是否无效,可以检查

bool isVoid = myDelegate.Method.ReturnType == typeof(void);

要具体测试委托是否为 Action,您可以使用

bool isActionT1_T2 = myDelegate.GetType().GetGenericTypeDefinition() == typeof(Action<,>);

这将匹配任何 Action<T1, T2>(具有两个通用类型参数)。您可以对 Func<T1, RetType> 和其他参数计数执行相同的操作。

不确定这是最好的还是唯一的方法,但是如果您有 类型 ,您可以寻找 .Invoke 方法:

Type type = ...
if(type.IsSubclassOf(typeof(Delegate)))
{
    var method = type.GetMethod("Invoke");
    foreach(var arg in method.GetParameters())
    {
        Console.WriteLine(arg.Name + ": " + arg.ParameterType.ToString());
    }
    Console.WriteLine("returns: " + method.ReturnType.ToString())
}

你的 .ReturnType 将是 typeof(void)


如果您有委托的 实例 ,您可以对委托本身的 .Method 属性 执行相同的操作:

Delegate instance = ...
var method = instance.Method;
foreach(var arg in method.GetParameters())
{
    Console.WriteLine(arg.Name + ": " + arg.ParameterType.ToString());
}
Console.WriteLine("returns: " + method.ReturnType.ToString());

回复:

like, if current delegate is action, run action and return current value,

你可以特例:

if(instance is Action) {
    ((Action)instance)();
} else {
    //...
}

但是,如果处理任意委托,您可能需要经常使用 DynamicInvoke

您可能想要这样的东西:

 static void InspectDelegate(object obj)
 {
     if (!(obj is Delegate del))
         return;
     var returnType = del.Method.ReturnType.Name;
     var parameters = del.Method.GetParameters();
     Dictionary<string, string> argNames = 
                   parameters.ToDictionary(a => a.Name, b => b.ParameterType.Name);
     if (obj is Action<string, int>)
         del.DynamicInvoke("foo", 2);
 }
 static void Main(string[] args)
 {
     Action<string, int> act = (x, y) => { Console.WriteLine("x={0}, y= {1}", x, y); };
     InspectDelegate(act);
 }