我已经看过所有的堆栈溢出,但还没有能够找到一个解决方案。如何使用反射来区分dynamic
和object
参数和返回类型?
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编译器可能不会。