我需要将值从数组传递给具有T:struct泛型约束的方法。
我有object[] values;
例如包含{ (int)7, (byte)3, (char)'a' }
(我在编译时不知道结构)
我需要将该数组或所有元素逐个传递给以下任何方法
DataStream(Array array)
DataStream(IntPtr ptrToArray, int sizeInbytes)
DataStream.Write<T>(T value) where T : struct
DataStream.WriteBytes(byte[] bytes)
第一种方法会在GCHandle.Alloc中写入一些错误(该对象不包含原始数据) 由于object不是struct
,因此第三个mthod将无法编译实际问题是我试图在SlimDX中创建包含VertexChannels的MeshBuilder,然后从中构建VertexBuffer
答案 0 :(得分:2)
好吧,你的数组将包含盒装值,这就是为什么前两个会失败的原因。你无法在一次通话中完成所有这一切。
选项:
使用反射调用泛型Write
方法,以这种方式获取值的执行时类型:
// You may well need to do more work here, if DataStream.Write is
// overloaded.
MethodInfo genericMethod = typeof(DataStream).GetMethod("Write");
foreach (object value in values)
{
Type type = value.GetType();
MethodInfo method = genericMethod.MakeGenericMethod(type);
method.Invoke(dataStream, value);
}
如果您使用的是C#4和.NET 4,请使用动态类型:
foreach (dynamic value in values)
{
dataStream.Write(value);
}
根据您支持的类型显式检查每个值:
foreach (object value in values)
{
if (value is char)
{
dataStream.Write((char) value);
}
else if (value is byte)
{
dataStream.Write((byte) value);
}
else if (value is int)
{
dataStream.Write((int) value);
}
else
{
throw new ArgumentException("Unsupported type in input data");
}
}
说实话,所有这些都可能相当缓慢。第一个可能是最慢的,但我不想在没有先测试它的情况下打赌。