2010-06-24 56 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的答案僅僅是停在這裏使用匿名類型,並使用一個元組或定義自己的類型。抱歉。