Обобщения со структурами и полями - PullRequest
1 голос
/ 03 сентября 2011

Здравствуйте, у меня проблема с дженериками, я создаю собственную структуру вершин для своей игры, и я хочу быть способным делать это с дженериками, чтобы я мог быстро изменить тип своей вершины.

вот как это выглядит сейчас:

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 ]

3 голосов
/ 03 сентября 2011

Вы можете создать в интерфейсе для ETerrainVertex, если вы используете свойства вместо полей:

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

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

Не беспокойтесь о влиянии производительности на свойства, так как в этом случае IIRC не существует.

2 голосов
/ 03 сентября 2011

Если вы хотите использовать только ETerrainVertex - вы должны , а не использовать обобщенные значения и явно указывать тип.Использование дженериков в таком случае просто бессмысленно, потому что вы не сможете использовать любой другой тип, кроме ETerrainVertex.Если вы хотите использовать другие типы - вы должны использовать наследование.И поскольку CLR не позволяет вам наследовать от структур - вы should указываете интерфейс и инкапсулируете свои поля в свойствах вашей структуры.

И следующая важная вещь - если вы решитеиспользовать интерфейс - возможно, произойдет много операций бокса, которые могут ухудшить производительность вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...