我有列表,我想映射到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;
}
请帮忙。
由于
答案 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>
( 支持差异)。