3

我正在寻找一种将对象转换为几种不同类型的结构之一的方法。我需要结构,因为我需要它不可为空。我不知道该怎么做,但这是我迄今为止尝试过的,但它不起作用,因为:“对象必须实现 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

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

公共 TData[] GetArrayofThings() 其中 TObject:IConvertible, TData: 结构

于 2012-07-27T18:36:59.757 回答
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,它用于真正的转换(例如,stringto int),而您拥有的是类型转换

于 2012-07-27T18:42:56.717 回答