var x = new { a = "foobar", b = 42 };
List<x.GetType()> y;
有没有不同的方法来做我想做的事情?
如果没有,我在隐式类型中并没有真正看到那么多......
答案 0 :(得分:12)
x.GetType()
是一个方法调用,在执行时进行评估。因此,它不能用于编译时概念,例如变量的类型。我同意偶尔能够做类似的事情(在其他地方指定变量的编译时类型作为类型参数)会非常方便,但目前你做不到。我不能说我经常想念它。
但是,可以执行:
var x = new { a = "foobar", b = 42 };
var y = new[] { x };
var z = y.ToList();
您还可以编写一个简单的扩展方法来创建一个列表:
public static List<T> InList<T>(this T item)
{
return new List<T> { item };
}
(如果需要,请选择其他名称:)
然后:
var x = new { a = "foobar", b = 42 };
var y = x.InList();
正如Marc所说,它根本不一定是一种扩展方法。唯一重要的是编译器可以使用类型推断来计算方法的类型参数,这样您就不必尝试命名匿名类型。
隐式类型的局部变量由于各种原因很有用,但它们在LINQ中特别有用,因此您可以创建临时投影而无需显式创建全新类型。
答案 1 :(得分:6)
使用通用方法可以实现此目的:
public static List<T> CreateList<T>(T example) {
return new List<T>();
}
...
var list = CreateList(x);
或通过使用数据创建列表,然后将其清空......