使用泛型将对象转换为struct

时间:2012-07-27 18:09:57

标签: c# generics struct

我正在寻找一种方法将对象转换为几种不同类型的结构之一。我需要结构,因为我需要它不可为空。我不知道该如何解决这个问题,但这是我迄今为止尝试过的,但它不起作用,因为:  “对象必须实现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()的任何处罚感到好奇,因为这是将被发送到流对象的数据,并且可能有很多。

2 个答案:

答案 0 :(得分:0)

ChangeType方法签名公开了两个参数,第一个:value必须是实现IConvertible接口的对象。在您的示例中,things是一个object数组,并未实现该接口。 您应该以不同的方式设计GetArrayOfThings方法:

  

public TData [] GetArrayofThings()其中TObject:IConvertible,TData:struct

答案 1 :(得分: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),你拥有的是类型转换