【问题标题】:How to cast a list of specific type to a list of generic type in c#如何在c#中将特定类型的列表转换为泛型类型的列表
【发布时间】:2012-12-31 13:10:35
【问题描述】:

我有想要映射到列表的列表。 但是,没有编译器错误,但在运行时结果为空。 获得一个通用的 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;
}

请帮忙。

谢谢

【问题讨论】:

  • 如果TU 类型是赋值兼容的,并不意味着List&lt;T&gt;List&lt;U&gt; 也是赋值兼容的。

标签: c# list generics casting


【解决方案1】:

错误在以下代码行:

result = output as List<T>;

C# 不允许您使用 as 运算符将 List&lt;TSomething&gt; 转换为 List&lt;TSomethingElse&gt;。由于 MSDN 中指定的原因,您看到了 null 值...

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

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

您的选择是使用foreach 循环逐项建立新列表,或者使用Enumerable.Cast(来自System.Linq),这将为您完成:

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

【讨论】:

  • "您的选择是使用 foreach 循环逐项构建新列表,或者 [...]" 请记住,这正是 LINQ 方法正在做的事情,它只是对你隐瞒。
【解决方案2】:

如果您专注于类型,坦率地说,泛型可能不是最佳选择。我想知道是否采用Type 实例并返回非泛型IList 是否更合适。但是:如果我们使用类型相等性,您可以通过object 进行转换:

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

如果你对IsAssignableFrom很挑剔,那就更难了; List&lt;SuperCategory&gt; 不能转换为 List&lt;Category&gt;(或相反)。您可以创建一个 new 列表(请参阅 Richard Ev 的回答),或使用 IEnumerable&lt;Category&gt;确实支持差异)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多