【问题标题】: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方法信息,你需要检查MyClass,ActivityStatus只是那里的一个参数。
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()
如果您使用正确的绑定标志(公共、静态),则应返回该方法。