要求Enum的扩展方法

时间:2014-11-05 05:42:09

标签: c# reflection enums extension-methods

我正在使用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);

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

2 个答案:

答案 0 :(得分: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}));
    }

在这种情况下,Extension是扩展类。 &#39; ENM&#39;是通用枚举实例。

答案 1 :(得分:0)

扩展方法没有附加到类型T,它附加到声明ToStringEnum扩展方法的类型Class

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

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