在审查了Kirill Osenkov的这个blog之后(如何创建一个匿名类型的通用列表?)我正在尝试做一些更先进和有问题的事情。
以下代码编译:
var anon = new { One = "1", Two = "2" };
var result = DoSomething(anon);
public static T DoSomething<T>(T value)
{
return value;
}
但是如果我尝试添加一个额外的泛型类型,我就无法构建它:
var anon = new { One = "1", Two = "2" };
var result = DoSomethingElse<int>(anon);
public static T2 DoSomethingElse<T, T2>(T value)
where T2 : new()
{
return new T2();
}
由于我无法指定T是typeof(anon),所以当给出T2的类型时,我似乎无法推断它。这可能吗?
答案 0 :(得分:2)
没有。 C#编译器不支持此类功能。您必须手动指定所有通用参数或无,并依赖于类型推断。
您最接近的是以下
var anon = new { One = "1", Two = "2" };
var result = DoSomethingElse(anon,42);
public static T2 DoSomethingElse<T, T2>(T value, T2 otherValue)
where T2 : new()
{
return new T2();
}
答案 1 :(得分:0)
不是一个令人满意的答案,但如果您能够容忍为每种类型DoSomethingWithT2
编写不同版本的T2
,则可以执行以下操作:
var anon = new { One = "1", Two = "2" };
var result = DoSomethingWithInt(anon);
public static int DoSomethingWithInt<T>(T value)
{
return DoSomethingElse<T, int>(value);
}
public static T2 DoSomethingElse<T, T2>(T value) where T2 : new()
{
return new T2();
}
最正确的答案就是在这里停止使用匿名类型并使用元组或定义自己的类型。遗憾。