【问题标题】:Detecting dynamic parameters and return types检测动态参数和返回类型
【发布时间】:2014-07-31 22:10:12
【问题描述】:

我查看了整个堆栈溢出,但还没有找到解决此问题的方法。如何使用反射区分dynamicobject 参数和返回类型?

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

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

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

我怎样才能只得到Foo而不是Bar

【问题讨论】:

    标签: c# reflection dynamic-typing


    【解决方案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 编译器可能不会。

    【讨论】:

    • 非常好 - 我很遗憾地说我有一个用例,因为我目前正在尝试清理整个代码库的整个部分,其中散布着dynamic(当它没有不需要!)。这将帮助我搜索它。
    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 2022-01-27
    • 2010-10-30
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多