3

オブジェクトをいくつかの異なるタイプの構造体の 1 つに変換する方法を探しています。null 非許容にする必要があるため、構造体が必要です。これについてどうすればよいかわかりませんが、これは私がこれまでに試したことであり、「オブジェクトは 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() のペナルティについてはまだ興味があります。

4

2 に答える 2

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。これは実際の変換(たとえば、stringへの変換int) のためであり、型キャストが行われます。

于 2012-07-27T18:42:56.717 に答える
0

ChangeTypeメソッド シグネチャは 2 つのパラメータを公開します。最初のパラメータは、valueIConvertible インターフェイスを実装するオブジェクトでなければなりません。あなたの例thingsではobject配列であり、そのインターフェースを実装していません。次のように、GetArrayOfThings メソッドを別の方法で設計する必要があります。

public TData[] GetArrayofThings() ここで、TObject:IConvertible、TData: 構造体

于 2012-07-27T18:36:59.757 に答える