我已经遍布堆栈溢出,但还没有能够找到解决方案。如何使用反射来区分dynamic
和object
参数以及返回类型?
例如,假设我在类中有许多方法:
public void Foo(dynamic d) { }
public void Bar(object o) { }
public dynamic Foo() { return "foo"; }
public object Bar() { return "bar"; }
我如何才能获得Foo
而不是Bar
?
答案 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编译器可能不会。