使用DrawUserIndexedPrimitives<>在通用基类中

时间:2011-10-19 14:33:46

标签: c# generics c#-4.0 xna xna-4.0

我正在编写一个与XNA一起工作的库。我有一个基元的基类,我计划从中构建Planes,Cubes和其他原始类型。理想情况下,无论使用何种顶点类型,我都希望我的基类能够进行渲染。

相关代码:

public abstract class Primitive<VT> where VT : IVertexType
{
    private void Draw(GraphicsDevice graphics)
    {
            graphics.DrawUserIndexedPrimitives<VT>(primitiveType_, 
                                                   vertices_, 
                                                   0, 
                                                   vertices_.Length, 
                                                   indices_, 
                                                   0, 
                                                   primitiveCount_);
    }    
} 

现在,除了使用适当的顶点类型派生的其他类:

public abstract class Plane<VT> : Primitive<VT> where VT : IVertextTpye { ... }
public class PlaneColored : Primitive<VertexPositionColor> { .... }
public class PlaneTextured : Primitive<VertexPositionTexture> { .... }

问题是,我在DrawUserIndexPrimitives&lt;&gt;上遇到编译错误拨打:

Error   1   The type 'VT' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'Microsoft.Xna.Framework.Graphics.GraphicsDevice.DrawUserIndexedPrimitives<T>(Microsoft.Xna.Framework.Graphics.PrimitiveType, T[], int, int, short[], int, int)'  C:\dev\Projects\2010\XNAParts\XNAParts\Parts\Primitive.cs   88

我无法将构造更改为struct,否则DrawUserIndexPrimitives的泛型参数将不起作用(因为它不是结构)。

有什么方法吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

如何将Primitive更改为要求VT是结构?

public abstract class Primitive<VT> where VT : struct, IVertexType

和类似的

public abstract class Plane<VT> : Primitive<VT> where VT : struct, IVertexType

你声称“DrawUserIndexPrimitives泛型参数不起作用(因为它不是结构)”但是你不清楚你的意思。哪个参数?我怀疑以上是你想要的,但它并不是很清楚。