使用DrawUserIndexedPrimitives<比;在泛型基类中

本文关键字:泛型 基类 DrawUserIndexedPrimitives 使用 | 更新日期: 2023-09-27 18:11:37

我正在编写一个与XNA一起工作的库。我有一个基类的原语,我计划从中构建平面,立方体和其他原语类型。理想情况下,我希望我的基类做渲染,而不管使用的顶点类型。

相关代码:

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<>调用上得到编译错误:

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的泛型参数将不起作用(因为它不是一个结构体)。

有别的办法吗?

提前感谢!

使用DrawUserIndexedPrimitives<比;在泛型基类中

如何改变Primitive要求VT是一个结构体?

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

和类似的

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

你声称"DrawUserIndexPrimitives通用参数不会工作(因为它不是一个结构体)",但不清楚你的意思是什么。哪些参数?我怀疑以上就是你想要的,但是不是很清楚。