2010-06-24 82 views
2

审查这一blog通过Kirill Osenkov(如何创建匿名类型的泛型列表?)我试图做一些更先进,有问题之后。使用匿名泛型类型与多个仿制药

下面的代码编译:

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(); 
    } 

因为我没有specifiying是t的方式是的typeof(匿名),我似乎无法得到给出T2类型,当它推断出这一点。这可能吗?

+0

你打算如何在你的代码中使用'T value'?你可能只能使用'object'。 – 2010-06-24 15:15:41

回答

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(); 
} 
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(); 
} 

正确-EST的答案仅仅是停在这里使用匿名类型,并使用一个元组或定义自己的类型。抱歉。