结构约束方法的数组元素

时间:2011-06-26 08:14:48

标签: c#

我需要将值从数组传递给具有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

1 个答案:

答案 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");
        }
    }
    

说实话,所有这些都可能相当缓慢。第一个可能是最慢的,但我不想在没有先测试它的情况下打赌。