我想查看if (obj is Action)
,但不知道其参数?
所以我想执行此代码,无论obj是Action
,Action<string>
还是
Action<sting, int, bool>
..等等。
if(obj is Action)
{
//..
}
答案 0 :(得分:2)
他们相关,但是他们是不同的。它们之间没有继承或接口关系,您可以在它们之间进行转换。唯一的形式关系是它们都是Delegate
的子类。除此之外,他们只是......我们在同一口气中谈论的有点朋友。
if(obj is Action)
适用于无参数版本,但不适用于带参数的版本,因为您需要提前知道 T
值;你可以查一下:
if(obj is Action<int>)
例如,但不是所有。您可以使用dynamic
作弊(有些方法可以使用dynamic
在DLR选择正确的泛型类型参数的情况下在反射和泛型之间进行切换),但到时候#&# 39;你做过,你也可以使用.DynamicInvoke(args)
。
答案 1 :(得分:2)
编辑:
要区分您尝试呼叫的Action
变体,您可以执行以下操作:
const string TYPENAME = "System.Action";
Type objType = obj.GetType();
if(objType.ToString().StartsWith(TYPENAME)) // it is Action
{
Type[] genericArguments = objType.GetGenericArguments();
object[] parameters = new object[genericArguments.Length];
// fill your parameters
(obj as MulticastDelegate).DynamicInvoke(parameters);
}