具有结构和字段的泛型

时间:2011-09-02 21:00:00

标签: c# xna

你好我有一个泛型的问题,我为我的游戏创建一个自定义顶点结构,我想用泛型来做这个,所以我可以快速改变我的顶点类型。

这就是它现在的样子:

public struct ETerrainVertex
{
    public Vector3 Position;
    public Vector3 Normal;
    public Vector2 TextureCoordinate;

    public static int SizeInBytes = (3 + 3 + 2) * 4;
    public static VertexElement[] VertexElements = new VertexElement[]
    {
        new VertexElement(0, VertexElementFormat.Vector3, VertexElementUsage.Position, 0),
        new VertexElement(0, VertexElementFormat.Vector3, VertexElementUsage.Normal, 0),
        new VertexElement(0, VertexElementFormat.Vector2, VertexElementUsage.TextureCoordinate, 0)
    };
}

然后我就这样使用它:

//I have to add a constraint to the T but an interface wont cut.
//where T : struct, thingThatAddsConstrainsPositionAndNormal
public sealed class EQuadNode<T> : IEclipse where T : struct
{ 
    T foo;
    foo.Position; //dont work
}

但是因为我使用字段我不能简单地创建一个接口并将其添加到where限制,因为接口只能具有属性。

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:3)

如果使用属性而不是字段,则可以在ETerrainVertex的界面中创建:

public interface IVertex
{
    public Vector3 Position {get;set;}
 }

public struct ETerrainVertex : IVertex
{
    public Vector3 Position {get;set;}
}

不要担心使用属性对性能的影响,因为在这种情况下没有IIRC。

答案 1 :(得分:2)

如果您只想使用 ETerrainVertex - 您应该使用泛型并明确地输入类型。在这种情况下使用泛型是没有意义的,因为除了ETerrainVertex之外你将无法使用任何其他类型。 如果要使用其他类型 - 则应使用继承。并且因为CLR不允许您从结构继承 - 您should指定一个接口并将您的字段封装到结构中的属性中。

接下来重要的事情 - 如果您决定使用界面 - 可能会发生很多可能影响应用程序性能的装箱操作。