检测动态参数和返回类型

时间:2014-07-31 22:10:13

标签: c# reflection dynamic-typing

我已经遍布堆栈溢出,但还没有能够找到解决方案。如何使用反射来区分dynamicobject参数以及返回类型?

例如,假设我在类中有许多方法:

public void Foo(dynamic d) { }
public void Bar(object o) { }

public dynamic Foo() { return "foo"; }
public object Bar() { return "bar"; }

我如何才能获得Foo而不是Bar

1 个答案:

答案 0 :(得分:1)

C#编译器会针对任何dynamic参数,返回类型或成员发出DynamicAttribute,您可以通过GetCustomAttributes检测这些参数。为简洁起见,您可以定义一个这样的辅助方法:

static bool IsDynamic(ParameterInfo pi) {
    return pi.GetCustomAttributes(typeof(DynamicAttribute), true).Length > 0;
}

或者如果使用.NET 4.5或更高版本,您可以从极其有用的CustomAttributeExtensions类扩展方法:

static bool IsDynamic(ParameterInfo pi) {
    return pi.IsDefined(typeof(DynamicAttribute));
}

然后你得到那些选择或返回动态类型的方法:

dynamicMethods = myType.GetMethods()
    .Where(mi => IsDynamic(mi.ReturnParameter) || mi.GetParameters().Any(IsDynamic));

请注意,如果您尝试直接使用DynamicAttribute,C#编译器将抛出错误,但其他CIL编译器可能不会。