调用Enum的扩展方法
本文关键字:方法 扩展 Enum 调用 | 更新日期: 2023-09-27 18:29:21
我正在使用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);
但没有工作,我没有主意。
您需要查找扩展方法本身:
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就是扩展类enm'是通用枚举实例。
扩展方法没有附加到类型t,而是附加到声明ToStringEnum扩展方法的类型class
MethodInfo methodInfo = typeof(extension method class name).GetMethod("ToStringEnum", new[] { typeof(T) });
var result = methodInfo.Invoke(null, new object[] { parsedEnum });