我正在寻找一种方法将对象转换为几种不同类型的结构之一。我需要结构,因为我需要它不可为空。我不知道该如何解决这个问题,但这是我迄今为止尝试过的,但它不起作用,因为: “对象必须实现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 :(得分: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
,它用于真正的转换(例如,string
到int
),你拥有的是类型转换