首页 > 解决方案 > 如何将泛型类型传递给静态方法

问题描述

我有一个通用方法,它将返回一个从枚举填充的选择列表。

public static IEnumerable<SelectListItem> GetGenericEnumSelectList<T>()
{
     return (Enum.GetValues(typeof(T)).Cast<int>().Select(e => new SelectListItem() { Text = EnumExtensions.GetEnumDescription((ProductsEnum)e) , Value = e.ToString() })).ToList();
}

我已经调用了一个我也调用过的静态方法GetEnumDescription,这需要一个枚举。如何传递当前类型而不是像我所做的那样对类型进行硬编码。所以如果T是不同类型的枚举,它将是通用的。

就像是:

public static IEnumerable<SelectListItem> GetGenericEnumSelectList<T>()
{
    return (Enum.GetValues(typeof(T)).Cast<int>().Select(e => new SelectListItem() { Text = EnumExtensions.GetEnumDescription((typeof(T))e) , Value = e.ToString() })).ToList();
}

编辑

的签名GetEnumDescription

public static string GetEnumDescription(Enum value)
{

///

}

标签: c#

解决方案


不幸的是,枚举没有通用约束——至少在C#7.3之前没有。所以以下是不可能的:

void SoSomething<T>(T myEnum) where T: Enum { }

您可以添加另一个约束,如此所述:

void SoSomething<T>(T myEnum) where T: struct, IConvertible{ }

但是,这对您没有多大帮助。

但是,在您的情况下,根本不需要强制转换,因为您的方法参数是Enum. 所以你可以简单地e转换为Enum

return (Enum.GetValues(typeof(T)).Cast<Enum>().Select(e => new SelectListItem { 
    Text = EnumExtensions.GetEnumDescription(e), 
    Value = Convert.ToInt32(e).ToString() 
})).ToList();

Bw 知道就投到Enum。否则会出现以下错误:

无法将类型转换intSystem.Enum


推荐阅读