我理解,泛型通常是为了编译时的安全,并允许我们保持强类型的collection.Then泛型如何允许我们存储匿名类型,比如
List<object> TestList = new List<object>();
TestList.Add(new { id = 7, Name = "JonSkeet" });
TestList.Add(new { id = 11, Name = "Marc Gravell" });
TestList.Add(new { id = 31, Name = "Jason" });发布于 2010-04-01 23:24:14
这是因为object是.Net中所有实例的根类型。因此,任何表达式都可以用于需要object的位置,因为它们都满足System.object的基本约定。
例如,以下内容是完全合法的。
List<object> TestList = new List<object>();
TestList.Add(new { id = 7, Name = "JonSkeet" });
TestList.Add("Foo");
TestList.Add(42);发布于 2010-04-01 23:21:23
因为所有东西都是(或者可以装箱到)一个object,这就是objects的List。
发布于 2010-04-02 00:17:29
其他人已经解释了为什么你的代码工作-你的例子是强类型的,因为一切都是对象,但这意味着它不是很有用。您不能从列表中获取元素并访问例如它们的Name属性,因为它们只是对象,所以这通常不起作用。
但是,也可以创建匿名类型的强类型List --只需使用如下所示的小实用方法即可完成:
static List<T> CreateList<T>(params T[] items) {
return items.ToList();
}问题是不能在不提供类型名称的情况下调用构造函数。当调用一个方法时,C#可以推断类型参数,所以你可以这样写:
var testList = CreateList(
new { id = 7, Name = "JonSkeet" },
new { id = 11, Name = "Marc Gravell" });
testList.Add(new { id = 31, Name = "Jason" });这是完全类型安全的,例如,您可以编写testList[0].Name来获取第一个人的名字。如果您尝试编写类似testList.Add(42)的代码,您将得到一个编译时错误,因为该列表被强类型化为只包含具有id和Name属性的匿名类型。
https://stackoverflow.com/questions/2561457
复制相似问题