2

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

请帮忙。

谢谢

4

2 回答 2

9

错误在以下代码行中:

result = output as List<T>;

C# 不会让您使用运算符强制List<TSomething>转换。由于 MSDN 中指定的原因,您看到了一个值...List<TSomethingElse>asnull

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

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

foreach您的选择是使用循环逐项构建新列表,或者使用Enumerable.Cast(from System.Linq) 为您执行此操作:

output.Cast<T>().ToList();
于 2012-12-31T13:20:08.190 回答
2

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

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

如果您对 . 很挑剔IsAssignableFrom,那就更难了;aList<SuperCategory> 不能转换为 a List<Category>(或相反)。您可以创建一个列表(请参阅 Richard Ev 的答案),也可以使用IEnumerable<Category>确实支持方差)。

于 2012-12-31T13:20:57.997 回答