简化C#代码以获得枚举中的元素数
在C#中,可以使用以下代码获取枚举中的元素数:简化C#代码以获得枚举中的元素数,c#,enums,C#,Enums,在C#中,可以使用以下代码获取枚举中的元素数: int numberOfElements = Enum.GetNames(typeof(MyEnum)).Length; 如何将此代码放入它自己的函数中(无论是普通函数、静态函数、扩展函数还是泛型函数),以便将对它的调用简化为以下内容: int numberOfElements = GetEnumEntries(MyEnum); // something like this int numberOfElements = GetEnumEn
int numberOfElements = Enum.GetNames(typeof(MyEnum)).Length;
如何将此代码放入它自己的函数中(无论是普通函数、静态函数、扩展函数还是泛型函数),以便将对它的调用简化为以下内容:
int numberOfElements = GetEnumEntries(MyEnum); // something like this
int numberOfElements = GetEnumEntries<MyEnum>(); // or this
我收到错误“找不到类型或命名空间t”private static int GetEnumEntries()
private static int GetEnumEntries<T>()
{
return Enum.GetNames(typeof(T)).Length;
}
{
返回Enum.GetNames(typeof(T)).Length;
}
typeof(t)
将始终计算为System.Type
,而不是枚举的实际类型。因此,直接使用t
System.Enum.GetNames(t).Length
您可以使用通用方法。最困难的部分是将类型参数限制为枚举,这不能仅在编译时完成。但使用中提到的方法,您可以使用:
public static int GetEnumEntries<T>() where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
throw new ArgumentException("T must be an enumerated type");
return Enum.GetNames(typeof(T)).Length;
}
public static int GetEnumEntries(),其中T:struct,IConvertible
{
if(!typeof(T).IsEnum)
抛出新ArgumentException(“T必须是枚举类型”);
返回Enum.GetNames(typeof(T)).Length;
}
真不敢相信事情竟如此简单。我想我已经尝试过这个方法了。只是为了更正你的试用代码:你应该删除typeof(t),t已经是一个类型了,直接在那里使用t。在调用方代码中,您需要检查为GetNumEntries(typeof(MyEnum))-假设您使用返回完成了该方法)。然后他必须调用它GetEnumEntries(typeof(MyEnum))
。它改变了nothing@OrkhanAlikhanov当然,但他必须提供类型。该方法只缩短了一些字符。在您的解决方案中,同样适用,只剩下typeof
。typeof(t)甚至不会编译,t是一个变量。答案很好,尽管我不明白为什么它是私有的?@MattParkins我认为这是因为IntelliSense。它默认使用私有访问修饰符生成方法,请参见
public static int GetEnumEntries<T>() where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
throw new ArgumentException("T must be an enumerated type");
return Enum.GetNames(typeof(T)).Length;
}