2011-03-30 39 views
2

如果我能得到一個對象到數組的轉換工作,這將是非常好的。C#將數組類型的對象轉換爲T,其中T是數組?

步驟:

  1. 我們獲得通過從外部源的數組。該數組裝在一個對象中。通常對象是一個int []或double [],但我們通常需要double []。
  2. 將其轉換爲T型數組。
  3. 返回轉換後的類型。

對於初學者來說,這工作正常

double[] r=Array.ConvertAll<int,double>((int[])o,Convert.ToDouble) 

但這並不(假定T是 「雙」)如double [] R = getValue(o);

public T[] getValue<T>(object o){ 
// ... some logic... 
return (T[])Array.ConvertAll<int,double>((int[])o,Convert.ToDouble) 

是否有可以使用的where約束?數組是一個「特殊對象」,所以我們不能用它作爲約束。

這是可能的.net而不訴諸IL?我們是否可以訴諸IL?

感謝, -Steven

+0

你是什麼意思「訴諸IL」嗎?你打算編寫自定義的IL代碼要解決這個問題? – 2011-03-30 10:17:45

回答

0

- 刪除以前的內容

對不起,我沒有看到這當然不會編譯Convert.ToDouble。爲了能夠處理任何類型的T,您必須將轉換回調傳遞給getValue

像這樣的東西應該做的工作:

public T[] getValue<T>(object o, Converter<int, T> converter) 
{ 
    // ... some logic... 
    return (T[])Array.ConvertAll<int,T>((int[])o, converter) 
} 

用法:

double[] result = getValue<double>(o, (i) => Convert.ToDouble(i)); 
+0

也不行,函數不會編譯。問題是因爲T可以是_anything_,而不是所有的東西都可以從double [] – Rob 2011-03-30 10:23:33

+0

@Rob轉換:雖然不是所有東西都可以轉換爲一個double類型的'Convert'類確實提供了一個需要'int'的重載,所以上面的代碼將會被編譯(也有一個重載需要'object',所以可以修改泛型函數來獲取' object'而不是'int' - 這會增加可能性在示例用法中轉換時出現運行時錯誤。) – 2011-03-30 10:33:50

+0

我的評論是在編輯前 – Rob 2011-03-30 11:18:51

1

試試這個:

public T[] getValue<T>(object o) 
{ 
    return (T[])Convert.ChangeType(o, typeof(T[])); 
} 

使用這樣的:

object doubleArr = new Double[] {1.3, 1.5, 1.7}; 
var returnedValue = getValue<double>(doubleArr); 

請注意,如果你在錯誤的類型傳爲模板,它會在運行時

2

這爲我工作失敗:

public T[] GetValue<T>(object o) 
{ 
     Converter<int, T> c = new Converter<int, T>(input => (T)System.Convert.ChangeType(input, typeof(T))); 
     return (T[])Array.ConvertAll<int, T>((int[])o, c); 
} 

我希望這有助於!

0

以上三個答案都適用。真棒。非常感謝。

一個問題:在上面的標記Convert.ToDouble中的呼叫者變成了(i) => Convert.ToDouble(i)。符號是否等同?

我在這裏是新的......我應該接受一個答案嗎?不知道是否可以,因爲當我發佈這個問題時,我沒有註冊。

在擴展上述答案,我得到這個工作,這是非常巧妙的解決辦法:

public T[,,] getValue_3d<T>(object o) { 
    return (T[,,])Convert.ChangeType(o,typeof(T[,,])); 
} 

用法:

object doubleArr=new Double[,,] { { { 1, 2, 3 }, { 4, 5, 6 } }, 
            { { 7, 8, 9 }, { 10, 11, 12 } } }; 
double[,,] returnedValue=getValue_3d<double>(doubleArr); 

一個我試過的東西本來就是個人有T (其中T是一個n-rank數組),獲取元素類型,然後進行轉換。從函數返回值時,它並不能很好地工作。

要做到這一點更加整齊,如果我們可以使用函數返回值進行重載,那麼會很好......但據我所知,這在C#中是不可能的。也許還有一個竅門。也試過錫+吹捧無濟於事(錫雙,而吹捧爲double[]/double[,]/double[,,]再次

感謝。

相關問題