如何找出 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);
}
我想知道当前的代表签名。
特别是我想分类 "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);
}