2014-11-05 62 views
0

的擴展方法,我用ToStringEnum擴展,如:徵集枚舉

public static string ToStringEnum(this YearOfSchooling value) 
{ 
    switch (value) 
    { 
    } 
} 

public static string ToStringEnum(this Grade value) 
{ 
    switch (value) 
    { 
    } 
} 

等等每一個枚舉。

現在我想創建泛型TML擴展來讀取這個枚舉WHERE T是枚舉。

public static T ParseEnum<T>(string value) 
{ 
    return (T) Enum.Parse(typeof (T), value, true); 
} 

public static MvcHtmlString DisplayEnumRowWithDisplayName<TModel, TValue, T>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) where T : struct, IEnumConverter 
{ 
    var metaData = ModelMetadata.FromLambdaExpression(expression, html.ViewData); 
    var model = metaData.Model; 
    var displayName = metaData.DisplayName; 

    string parsedValue = string.Empty; 
    if (model != null) 
    { 
     if (!string.IsNullOrEmpty(model.ToString())) 
     { 
      var parsedEnum = EnumUtils.ParseEnum<T>(model.ToString()); 
      var type = typeof(T); 
      parsedValue = type.GetMethod("ToStringEnum", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); 
     } 
    } 
    return new MvcHtmlString(
     "<div class=\"control-group\"><label class=\"control-label\">{0}</label><div class=\"controls\"><span class=\"input-xlarge uneditable-input\">{1}</span></div></div>" 
     .FormatWith(displayName, parsedValue)); 
} 

但我不知道如何調用ToStringEnum方法。我嘗試過:

parsedValue = type.GetMethod("ToStringEnum", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); 

但沒有工作,我沒有想法。

+0

擴展方法是從..它們不直接與類相關聯的編譯器糖衣對此擴展方法進行了定義..因此,對該類型的反思將不會以任何方式爲您提供擴展方法的訪問權..您必須考慮替代方案..這將取決於您的實際需要。 – 2014-11-05 05:48:40

回答

2

你需要查找的擴展方法本身:

private static void TestEnumExtension<T>(T enm) 
    { 
      Type[] types = {enm.GetType()}; 
      MethodInfo method = typeof(Extension).GetMethod("ToStringEnum", BindingFlags.Public | BindingFlags.Static, null, types, null); 
      Console.WriteLine(method.Invoke(null, new object[] {enm})); 
    } 

在這種情況下,擴展是擴展類。 'enm'是泛型枚舉實例。

0

擴展方法沒有連接到類型T,它附連到類型類聲明ToStringEnum擴展方法

MethodInfo methodInfo = typeof(extension method class name).GetMethod("ToStringEnum", new[] { typeof(T) }); 

var result = methodInfo.Invoke(null, new object[] { parsedEnum });