检测动态参数和返回类型

本文关键字:返回类型 参数 动态 检测 | 更新日期: 2023-09-27 18:16:04

我已经看过所有的堆栈溢出,但还没有能够找到一个解决方案。如何使用反射来区分dynamicobject参数和返回类型?

例如,假设在一个类中有许多方法,如下所示:
public void Foo(dynamic d) { }
public void Bar(object o) { }
public dynamic Foo() { return "foo"; }
public object Bar() { return "bar"; }

为什么只能得到Foo而不能得到Bar ?

检测动态参数和返回类型

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编译器可能不会。