Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简化C#代码以获得枚举中的元素数_C#_Enums - Fatal编程技术网

简化C#代码以获得枚举中的元素数

简化C#代码以获得枚举中的元素数,c#,enums,C#,Enums,在C#中,可以使用以下代码获取枚举中的元素数: int numberOfElements = Enum.GetNames(typeof(MyEnum)).Length; 如何将此代码放入它自己的函数中(无论是普通函数、静态函数、扩展函数还是泛型函数),以便将对它的调用简化为以下内容: int numberOfElements = GetEnumEntries(MyEnum); // something like this int numberOfElements = GetEnumEn

在C#中,可以使用以下代码获取枚举中的元素数:

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;
}