簡體   English   中英

C# 將數組類型的object轉換為T,其中T是數組?

[英]C# Convert object of type array to T, where T is an array?

如果我能讓 object 到數組轉換正常工作,那就太好了。

腳步:

  1. 我們從外部源傳遞了一個數組。 該數組封裝在 object 中。通常 object 是 int[] 或 double[],但我們通常需要 double[]。
  2. 將其轉換為類型 T 的數組。
  3. 返回轉換后的類型。

對於初學者來說,這很好用

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

但這不是(假設 T 是“double”)例如 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,是否有可能?

謝謝,-史蒂文

這對我有用:

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

我希望這有幫助!

試試這個:

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

請注意,如果為模板傳入了錯誤的類型,它將在運行時失敗

- 刪除了之前的內容

對不起,我沒有看到當然不能編譯的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));

以上三個答案都有效。 真棒。 非常感謝。

一個問題:在上面的符號中,調用者中的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級數組),獲取元素類型,然后進行轉換。 從函數返回值時,它不能很好地工作。

為了更加整潔地做到這一點,如果我們可以使用函數返回值進行重載,那就太好了......但據我所知,這在C#設計中是不可能的。 也許還有另外一招。 也試過TIn + TOut無濟於事(TIn是雙倍的,TOut是double[] / double[,] / double[,,]

再次感謝。

這是另一個解決方案:D

public T[] getValue<T>(object o) => o as T[];

但是,這可能會返回一個null值,因為它是如何as的(而不是崩潰——這可能是一件好事?)。 as在運行時工作,所以要小心你如何使用它,但如果你使用object s 那么你已經在危險的水域中航行了。

我喜歡執行以下操作,這樣我就不必到處處理null

public T[] getValue<T>(object o) => o as T[] ?? Array.Empty<T>();

此外,這樣你就不必使用另一個間接級別:3


編輯:我也注意到你說過

通常 object 是一個 int[] 或 double[],但我們通常需要 double[]。

如果你知道你只想要這兩種類型,那么你也可以更明確:

public T[] getValue<T>(object o) => o switch {
    int[] array    => array as T[],
    double[] array => array as T[],
    var _          => null,
} ?? Array.Empty<T>();

也許維護起來更痛苦,但它更明確一些。 除了返回null ,您還可以拋出錯誤以確保您沒有傳遞錯誤的類型。

我希望這對某人有幫助:3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM