你好我有一个泛型的问题,我为我的游戏创建一个自定义顶点结构,我想用泛型来做这个,所以我可以快速改变我的顶点类型。
这就是它现在的样子:
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限制,因为接口只能具有属性。
有没有办法做到这一点?
答案 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
指定一个接口并将您的字段封装到结构中的属性中。
接下来重要的事情 - 如果您决定使用界面 - 可能会发生很多可能影响应用程序性能的装箱操作。