Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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#_Generics_Enums - Fatal编程技术网

C# 创建枚举列表并将其传递给方法

C# 创建枚举列表并将其传递给方法,c#,generics,enums,C#,Generics,Enums,我创建了一个方法,该方法接受一个枚举并在字典中对其进行转换,其中每个int都与枚举的名称(作为字符串)相关联 // Define like this public static Dictionary<int, string> getDictionaryFromEnum<T>() { List<T> commandList = Enum.GetValues(typeof(T)).Cast<T>().ToList(); Dictionary

我创建了一个方法,该方法接受一个枚举并在字典中对其进行转换,其中每个int都与枚举的名称(作为字符串)相关联

// Define like this
public static Dictionary<int, string> getDictionaryFromEnum<T>()
{
   List<T> commandList = Enum.GetValues(typeof(T)).Cast<T>().ToList();
   Dictionary<int, string> finalList = new Dictionary<int, string>();
   foreach (T command in commandList)
   {
    finalList.Add((int)(object)command, command.ToString());
   }
 return finalList;
 }
//定义如下
公共静态词典getDictionaryFromEnum()
{
List commandList=Enum.GetValues(typeof(T)).Cast().ToList();
Dictionary finalList=新字典();
foreach(commandList中的T命令)
{
Add((int)(object)命令,command.ToString();
}
回归终结者;
}
(顺便说一句,是的,我有一个双重转换,但这个应用程序是一个非常便宜和肮脏的C#-enum到Javascript enum转换器)

这样很容易使用

private enum _myEnum1 { one = 1001, two = 1002 };
private enum _myEnum2 { one = 2001, two = 2002 };
// ... 
var a = getDictionaryFromEnum<_myEnum1>();
var b = getDictionaryFromEnum<_myEnum2>();
private enum_myEnum1{one=1001,two=1002};
私有枚举{1=2001,2=2002};
// ... 
var a=getDictionaryFromEnum();
var b=getDictionaryFromEnum();
现在,我想知道是否可以创建一个枚举列表,用于一系列调用以迭代调用

这是原始问题:[为什么我不能称之为?]

我应该怎么做才能创建这样的呼叫

List<Type> enumsToConvertList = new List<Type>();
enumsToConvertList.Add(typeof(_myEnum1));
enumsToConvertList.Add(typeof(_myEnum2));
// this'll be a loop
var a = getDictionaryFromEnum<enumsToConvertList.ElementAt(0)>();
List enumsToConvertList=新列表();
添加(typeof(_myEnum1));
添加(typeof(_myEnum2));
//这将是一个循环
var a=getDictionaryFromEnum();

简单来说,泛型的类型参数必须在编译时已知

您正试图将运行时
System.Type
对象作为泛型类型说明符传递,这是不可能的


至于您试图实现的目标,您的方法实际上不需要是泛型的,因为您总是返回一个
字典。尝试将
类型作为参数传递给方法,如@lazyberezovsky所示

为什么我不能叫这个


在这种情况下,您传递的是
System.Type
,它不同于泛型说明符,泛型说明符是编译时值。

您不能在运行时指定泛型参数类型(当然,没有反射)。因此,只需创建非泛型方法,该方法接受
Type
Type的参数:

public static Dictionary<int, string> getDictionaryFromEnum(Type enumType)
{
    return Enum.GetValues(enumType).Cast<object>()
               .ToDictionary(x => (int)x, x => x.ToString());
}
公共静态词典getDictionaryFromEnum(类型enumType)
{
返回Enum.GetValues(enumType.Cast())
.ToDictionary(x=>(int)x,x=>x.ToString());
}
用法:

List<Type> enumsToConvertList = new List<Type>();
enumsToConvertList.Add(typeof(_myEnum1));
enumsToConvertList.Add(typeof(_myEnum2));

var a = getDictionaryFromEnum(enumsToConvertList[0]);
List enumsToConvertList=新列表();
添加(typeof(_myEnum1));
添加(typeof(_myEnum2));
var a=getDictionaryFromEnum(enumsToConvertList[0]);

稍后转换为类型:

List<Type> enumsToConvertList = new List<Type>();
enumsToConvertList.Add(_myEnum1);
var a = getDictionaryFromEnum<typeof(enumsToConvertList.ElementAt(0))>();
List enumsToConvertList=新列表();
enumsToConvertList.Add(_myEnum1);
var a=getDictionaryFromEnum();

这里有一个替代方法,它将枚举作为泛型并返回所有成员的字典

 public static Dictionary<int, string> ToDictionary<T>()
    {
        var type = typeof (T);
        if (!type.IsEnum) throw new ArgumentException("Only Enum types allowed");
        return Enum.GetValues(type).Cast<Enum>().ToDictionary(value => (int) Enum.Parse(type, value.ToString()), value => value.ToString());
    }
公共静态字典ToDictionary()
{
var类型=类型(T);
如果(!type.IsEnum)抛出新的ArgumentException(“仅允许枚举类型”);
返回Enum.GetValues(type).Cast().ToDictionary(value=>(int)Enum.Parse(type,value.ToString()),value=>value.ToString());
}

因为泛型中使用的类型与
System.Type
s不同。
a
的类型是什么?因为泛型只支持静态类型。您正在尝试将类型对象放入泛型方法中的类型参数中。尝试用ObjectType重写getDictionaryFromEnum谢谢你的建议,也很抱歉引起了骚动。谢谢你,我会接受你的回答。我将从我简历的C#栏中删除“高级知识”。@malber也许你只需要读几篇关于泛型和Linq的文章,而不是修改你的简历:)