【问题标题】:Reflection on enum extension method located in separate assembly [duplicate]对位于单独程序集中的枚举扩展方法的反思[重复]
【发布时间】:2014-06-02 12:24:48
【问题描述】:

我的代码:

public enum ActivityStatus
{
    All = 0,
    Active = 1,
    Inactive = 2
}

public static class MyClass
{
    public static string Test(this ActivityStatus _value) { return _value + "111"; } 
}

并且typeof(ActivityStatus).GetMethods() 不包含测试方法。我什至尝试将所有内容放在同一个程序集中,但仍然没有成功。我哪里错了?

【问题讨论】:

    标签: c# reflection enums extension-methods


    【解决方案1】:

    扩展方法只是静态方法,编译器会翻译这个调用

    yourEnum.Test();
    

    到:

    MyClass.Test(yourEnum);
    

    所以为了通过反射获得Test方法信息,你需要检查MyClassActivityStatus只是那里的一个参数。

    var testMethodInfo = typeof(MyClass).GetMethod("Test");
    var firstParameter = testMethodInfo.GetParameters()[0];
    
    Console.WriteLine (firstParameter.ParameterType + " " + firstParameter.Name);
    

    打印:

    ActivityStatus _value
    

    如果你想获得 all 扩展方法来输入特定程序集,你可以使用下面的代码:

    var extensionMethodsForActivityStatus = 
            typeof(ActivityStatus) //type from assembly to search
               .Assembly  //pick an assembly
               .GetTypes() //get all types there 
               .SelectMany(t => t.GetMethods()) //get all methods for that type
               .Where(m => m.GetParameters().Any() &&
                           m.GetParameters().First().ParameterType == typeof(ActivityStatus)) //check if first parameter is our enum
               .Where(m => m.IsDefined(typeof(ExtensionAttribute), true)); //check if the method is an extension method
    
    foreach(var extensionMethod in extensionMethodsForActivityStatus)
        Console.WriteLine(extensionMethod.Name); //prints only Test
    

    【讨论】:

      【解决方案2】:

      你为什么期望它在那里?枚举没有方法。扩展方法在类MyClass 中。您可以使用不同的语法调用它,因此它看起来就像 ActivityStatus 的方法,这一事实只是语法糖。

      typeof(MyClass).GetMethods()
      

      如果您使用正确的绑定标志(公共、静态),则应返回该方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 1970-01-01
        • 2010-09-21
        • 1970-01-01
        • 2011-08-13
        • 1970-01-01
        相关资源
        最近更新 更多