行动和行动是否完全不同?

时间:2017-06-19 13:02:55

标签: c# generics delegates

我想查看if (obj is Action),但不知道其参数?

所以我想执行此代码,无论obj是ActionAction<string>还是 Action<sting, int, bool> ..等等。

if(obj is Action)
{
   //..
}

2 个答案:

答案 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);
}

Online example