2012-07-27 50 views
2

我正在尋找一種方法將對象轉換爲幾種不同類型的結構之一。我需要結構,因爲我需要它是不可空的。我不知道如何去解決這個問題,但這是我迄今爲止所嘗試的,並且不起作用,因爲: 「對象必須實現IConvertible。」 < - 試圖Convert.ChangeType將對象轉換爲具有泛型的結構

public class Something 
{ 
    private object[] things; 

    public Something() 
    { 
     //I don't know at compile time if this will 
     //be an array of ThingA's or ThingB's 
     things = new object[1]; 

     things[0] = new ThingA(); 
     ThingA[] thingsArrayA = GetArrayofThings<ThingA>(); 

     things[0] = new ThingB(); 
     ThingB[] thingsArrayB = GetArrayofThings<ThingB>(); 
    } 

    public TData[] GetArrayofThings<TData>() where TData : struct 
    { 
     return (TData[])Convert.ChangeType(things, typeof(TData[])); 
    } 
} 

[Serializable] 
public struct ThingA 
{ 
    //... 
} 

[Serializable] 
public struct ThingB 
{ 
    //... 
} 

這是工作實現得益於SERG的回答是:

public TData[] GetArrayofThings<TData>() where TData: struct 
    { 
     return things.OfType<TData>().ToArray<TData>(); 
    } 

我還是好奇的.ToArray()的任何處罰,因爲這是這將是數據發送給流對象,並且可能會有很多。

+0

爲什麼你需要它是不可空的?在什麼情況下?這似乎很多工作沒有明顯的原因(但我可能是盲人)。 – 2012-07-27 18:12:41

+0

你究竟想在這裏完成什麼?爲什麼你需要對象是不可空的?此外,我不認爲你完全明白你想在這裏做什麼。您不能僅僅將對象轉換爲結構。您需要在類和結構之間定義一個結構和某種形式的轉換,方法或用戶定義的轉換。 – Michael 2012-07-27 18:15:38

回答

0

在我看來,那幾個LINQ查詢就足夠了。

//getting only ThingA from mixed array 
IEnumerable<ThingA> thingsA = things.OfType<ThingsA>() 
//we know type of thins inside array, so we just need type conversion 
IEnumerable<ThingB> thingsB = things.Cast<ThingB>() 

不要使用Convert,它的真正的轉換(例如,stringint),和你有什麼是型鑄造

+0

這讓我更接近。爲了使用IEnumerable 作爲流對象的非空參數,我需要這樣做: thingsA.ToArray (); 這會招致很多開銷嗎? – FrozT 2012-07-27 20:15:34

0

ChangeType方法簽名公開了兩個參數,第一個:value必須是實現IConvertible接口的對象。在你的例子中things是一個object數組,並沒有實現該接口。 你應該設計自己的GetArrayOfThings方法在這樣一種不同的方式:

公共TDATA [] GetArrayofThings()其中TObject的:IConvertible,TDATA:結構

相關問題