我有一个object []数组,其中包含一些内置类型的混合,比如Int / Byte / String,我试图在运行时从对象转换为正确的类型,然后将该转换的数据交给a具有Write(内置类型重载)方法的第三方库。
我以为我可以做Obj.Write((表达式产生System.Type)objArg),但它对我有误。
这是一个更好地解释它的代码示例:
object testData = (int)42;
int final = (GetAType())testData;
private Type GetAType()
{
return typeof(Int32);
}
有什么建议吗? 实现这一目标的替代方法也会有所帮助。
对于某些情况,这是我原来的问题。 第三方库,包含一堆不同类型的重载。
3rdPartyLibrary.Write(bool source)
3rdPartyLibrary.Write(int16 source)
3rdPartyLibrary.Write(int32 source)
3rdPartyLibrary.Write(string source)
我正在尝试在3rdPartyLibrary和我的其余代码之间抽象一层
Such that I can have
Object[int32]
Object[int16]
Object[string]
Object[int32]
我正在尝试做一些简单的看似,像这样(伪造的)
loop Object[]
{
3rdPartyLibrary.Write( (object[i].GetType()) object[i] )
}
我一直在阅读所有类似的声音问题,看起来这可能不可能?
答案 0 :(得分:1)
强制转换是编译时构造;你不能在强制转换操作符中使用调用的结果。
有两种方法可以解决您的问题。
如果您使用的是.NET 4:
3rdPartyLibrary.Write((dynamic)object[i]);
否则,你必须使用反射根据参数类型选择正确的重载,然后调用它。
答案 1 :(得分:1)
你正在寻找的东西是没有意义的,因为结果仍然必须为所有操作都有一个类型,并且必须object
来处理所有不同的类型。
只需为您支持的类型使用开关:
foreach (object item in Object) {
switch (item.GetType().Name) {
case "System.Int16":
3rdPartyLibrary.Write((Int16)item);
break;
case "System.Int32":
3rdPartyLibrary.Write((Int32)item);
break;
case "System.Boolean":
3rdPartyLibrary.Write((bool)item);
break;
case "System.String":
3rdPartyLibrary.Write((string)item);
break;
default:
throw new ArgumentException("Unhandled type '" + item.GetType().Name + "'.");
}