如何将特定类型的列表转换为c#中的泛型类型列表

时间:2012-12-31 13:10:36

标签: c# list generics casting

我有列表,我想映射到List。 但是,没有编译器错误,但在运行时结果为null。 获得通用List<T>将帮助我使我的代码通用并重用于不同的对象。

private static List<T> GetIndexData(DataAdapter dataAdapter)
{
  Type type = typeof(T);
  List<T> result = new List<T>();

  if (typeof(Category).IsAssignableFrom(typeof(T)))
  {
    var output = ItemStoreDataManager.GetAllCategoryNames(dataAdapter);                
    result = output as List<T>;                    
  }
  return result;
}

以上代码结果将显示为空。

internal static List<Category> GetAllCategoryNames(DataAdapter dataAdapter)
{
  List<Category> result = new List<Category>();

  ...........
  return result;
}

请帮忙。

由于

2 个答案:

答案 0 :(得分:9)

错误位于以下代码行中:

result = output as List<T>;

C#不允许您使用as运算符将List<TSomething>投射到List<TSomethingElse>。您在MSDN中指定的原因看到null值...

  

as运算符就像一个强制转换操作。但是,如果无法进行转换,则返回null而不是引发异常。

     

请注意,as运算符仅执行引用转换和装箱转换。 as运算符无法执行其他转换,例如用户定义的转换,而应使用强制转换表达式执行转换。

您可以选择使用foreach循环逐项构建新列表,也可以使用Enumerable.Cast(来自System.Linq)来为您执行此操作:< / p>

output.Cast<T>().ToList();

答案 1 :(得分:2)

如果你是专业的类型,坦率地说,仿制药可能不是最好的选择。我想知道是否采用Type实例,并返回非通用IList更合适。但是:如果我们使用类型相等,您只需通过object转换它:

if (typeof(Category) == typeof(T))
{
    var output = ItemStoreDataManager.GetAllCategoryNames(dataAdapter);
    result = (List<T>)(object)output;
}

如果你对IsAssignableFrom挑剔,那就更难了; List<SuperCategory> 无法强制转换为List<Category>(或相反)。您可以创建列表(请参阅Richard Ev的回答),也可以使用IEnumerable<Category> 支持差异)。