C# 尝试将enum system.array转换为enum List<;T>;在c中#

C# 尝试将enum system.array转换为enum List<;T>;在c中#,c#,list,enums,C#,List,Enums,我试图创建一个泛型函数,将枚举System.Array转换为这些枚举的列表,但我不知道枚举数组的类型。我试过几种方法,但都没能成功。应该是这样的…,谢谢 public static List<T> SArrayEnumToList<T>(System.Array arr){ Type enumType = typeof(T); if(enumType.BaseType != typeof(Enum)) th

我试图创建一个泛型函数,将枚举System.Array转换为这些枚举的列表,但我不知道枚举数组的类型。我试过几种方法,但都没能成功。应该是这样的…,谢谢

    public static List<T> SArrayEnumToList<T>(System.Array arr){
        Type enumType = typeof(T);

        if(enumType.BaseType != typeof(Enum))
            throw new ArgumentException("T must be of type System.Enum");

        List<T> enumList = new List<T>(new T[arr.Length]);
        int i;
        for(i=0;i<arr.Length;i++) {
            enumList.Add(( T )Enum.Parse(enumType, arr.GetValue(i).ToString()));
        }

        return enumList;
    }
公共静态列表SArrayEnumToList(System.Array arr){
类型enumType=typeof(T);
if(enumType.BaseType!=typeof(Enum))
抛出新ArgumentException(“T必须是System.Enum类型”);
列表枚举列表=新列表(新的T[arr.Length]);
int i;

对于(i=0;i假设您有一个
int
数组,我想这应该是可行的

public static List<T> SArrayEnumToList<T>(int[] arr) where T : struct, IConvertible
{
    if (!typeof (T).IsEnum)
        throw new ArgumentException("T must be of type System.Enum");

    // cast to object first
    return arr.Cast<object>()
              .Cast<T>()
              .ToList();
}

// or

public enum Test
{
    blah,
    balh2,
    blah3
}

...

var results = ((Test[])(object)values).ToList();
公共静态列表SArrayEnumToList(int[]arr),其中T:struct,IConvertible
{
if(!typeof(T).IsEnum)
抛出新ArgumentException(“T必须是System.Enum类型”);
//先向对象强制转换
返料角铸件()
.Cast()
.ToList();
}
//或
公共枚举测试
{
诸如此类,
balh2,
废话
}
...
var results=((测试[])(对象)值);

假设您有一个
int
数组,我想这应该可以

public static List<T> SArrayEnumToList<T>(int[] arr) where T : struct, IConvertible
{
    if (!typeof (T).IsEnum)
        throw new ArgumentException("T must be of type System.Enum");

    // cast to object first
    return arr.Cast<object>()
              .Cast<T>()
              .ToList();
}

// or

public enum Test
{
    blah,
    balh2,
    blah3
}

...

var results = ((Test[])(object)values).ToList();
公共静态列表SArrayEnumToList(int[]arr),其中T:struct,IConvertible
{
if(!typeof(T).IsEnum)
抛出新ArgumentException(“T必须是System.Enum类型”);
//先向对象强制转换
返料角铸件()
.Cast()
.ToList();
}
//或
公共枚举测试
{
诸如此类,
balh2,
废话
}
...
var results=((测试[])(对象)值);

您只需要使用Linq方法:

文档说明
ToList()
返回一个列表“包含输入序列中的元素”

如果您确实想将此功能分解为您自己的方法,您可以按如下方式执行此操作:

private static List<T> ToList<T>(T[] enums) where T : struct, IConvertible
{
    if (!typeof(T).IsEnum)
    {
        throw new ArgumentException("T must be an enum.");
    }
    return enums.ToList();
}
编辑#2 评论后更新

public static IList ToList(Array array)
{
    Type elementType = array.GetType().GetElementType();
    Type listType = typeof(List<>).MakeGenericType(new[] { elementType });
    IList list = (IList)Activator.CreateInstance(listType);
    foreach (var enumValue in array)
    {
        list.Add(enumValue);
    }
    return list;
}
公共静态IList列表(数组)
{
Type elementType=array.GetType().GetElementType();
Type listType=typeof(List).MakeGenericType(new[]{elementType});
IList list=(IList)Activator.CreateInstance(listType);
foreach(数组中的变量枚举值)
{
列表。添加(枚举值);
}
退货清单;
}

您只需要使用Linq方法:

文档说明
ToList()
返回一个列表“包含输入序列中的元素”

如果您确实想将此功能分解为您自己的方法,您可以按如下方式执行此操作:

private static List<T> ToList<T>(T[] enums) where T : struct, IConvertible
{
    if (!typeof(T).IsEnum)
    {
        throw new ArgumentException("T must be an enum.");
    }
    return enums.ToList();
}
编辑#2 评论后更新

public static IList ToList(Array array)
{
    Type elementType = array.GetType().GetElementType();
    Type listType = typeof(List<>).MakeGenericType(new[] { elementType });
    IList list = (IList)Activator.CreateInstance(listType);
    foreach (var enumValue in array)
    {
        list.Add(enumValue);
    }
    return list;
}
公共静态IList列表(数组)
{
Type elementType=array.GetType().GetElementType();
Type listType=typeof(List).MakeGenericType(new[]{elementType});
IList list=(IList)Activator.CreateInstance(listType);
foreach(数组中的变量枚举值)
{
列表。添加(枚举值);
}
退货清单;
}

intVal
不是索引,而是值。请正确使用
foreach
,或者切换到
for
。如果您不知道类型,为什么要使用该类型?
foreach(arr中的t值)枚举列表。添加(值);
修复它。请注意,您要求数组是一维的,只是更易于使用t[]作为参数。类型推断现在可以工作了。谢谢,我修复了。但这不是问题。问题在于系统。数组是枚举数组。
intVal
不是索引,而是值。正确使用
foreach
,或者切换到
for
。如果你不知道类型,为什么要使用类型?
foreach(arr中的T值)枚举列表。添加(值);
修复它。请注意,您要求数组是一维的,只是更易于使用T[]正如参数一样。类型推断现在起作用了。谢谢,我修复了。但这不是问题所在。问题在于系统。数组是枚举数组。虽然这可能回答了作者的问题,但它缺少一些解释词和指向文档的链接。如果没有一些短语,原始代码片段就没有多大帮助。您也可能会发现它非常有用。请编辑您的答案。谢谢您的答案。问题是我不能使用T[],我必须使用System.Array,该函数是从另一个传递枚举列表对象的函数调用的。System.Array不允许我使用Linq。我肯定我做错了什么,但这适用于除枚举列表之外的所有类型。:/I明白了。我用一个新示例编辑了我的答案,尝试并确认工作正常。谢谢,但我有e错误,方法`PACO.SArrayEnumToList(System.Array)的类型参数'无法从用法推断。请尝试显式指定类型参数,我将返回同一个问题。更新了我的答案,请参阅编辑#2。虽然这可能回答了作者的问题,但它缺少一些解释词和指向文档的链接。如果没有一些短语,原始代码片段将不会有很大帮助。您可能还会发现pful。请编辑您的答案。谢谢您的答案。问题是我不能使用T[],我必须使用System.Array,该函数是从另一个传递枚举列表对象的函数调用的。System.Array不允许我使用Linq。我肯定我做错了什么,但这适用于除枚举列表之外的所有类型。:/I明白了。我用一个新示例编辑了我的答案,尝试并确认工作正常。谢谢,但我有e由于出现错误,无法从用法中推断出方法“PACO.SArrayEnumToList(System.Array)”的类型参数。请尝试显式指定类型参数,然后返回相同的问题。更新了我的答案,请参阅编辑#2。感谢您的回答。我将尝试使用int[]但我认为它不会工作,因为该函数是从另一个传递枚举列表对象的函数调用的。我需要使用System.Array,它不允许我使用Linq。谢谢你的回答。我将尝试使用int[],但我认为它不会工作,因为