2 votes

C# : accès aux membres statiques de T

J'ai trouvé beaucoup de sujets similaires sur ce thème, mais aucun ne répond directement à ma question. Je réalise un jeu qui consiste à placer différents types de pièces. J'ai une classe Room, puis plusieurs salles qui en héritent, par exemple Bedroom, Canteen, etc.

Chaque pièce dispose de certains paramètres statiques pour définir ses attributs. Par exemple :

public class Room : WorldEntity
{
    public static string Name = "Room";
    public static uint MinHeight = 0;
    public static uint MinWidth = 0;
    //...
}

public class Bedroom : Room
{
    new public static string Name = "Bedroom";
    new public static uint MinHeight = 4;
    new public static uint MinWidth = 4;  
     //...
}

Lors de la création de la pièce, je passe d'abord par le type de la pièce requise, par ex.

public static void PlaceRoom(Type T){//begin room creation process}

Ce que je veux savoir, c'est comment obtenir les attributs de T à partir de ma fonction PlaceRoom ? Par exemple, comment puis-je obtenir T.MinHeight (qui renvoie 4 lorsque T est de type Bedroom) ? Ou existe-t-il une meilleure façon de procéder ?

Je n'avais pas l'intention d'initialiser ma classe T (où T : Room) avant plus tard, c'est pourquoi les membres étaient statiques et j'essaie d'utiliser des génériques.

3voto

Jon B Points 26872

Une option serait de créer un IRoom qui définirait ces valeurs comme des propriétés. Chaque classe implémenterait ces propriétés et renverrait un résultat codé en dur.

Une autre option serait de créer un ou plusieurs attributs et les appliquer à vos cours. Le site PlaceRoom utiliserait la réflexion pour lire les attributs.

1voto

Adam Kostecki Points 301

Tout d'abord, vous avez créé des champs statiques publics, ce qui est une très mauvaise conception. Les champs statiques publics doivent être en lecture seule. Puisque vous ne pouvez pas rendre virtuels les champs et propriétés statiques et que vous ne voulez pas créer une instance avant d'appeler PlaceRoom, vous pouvez utiliser des attributs pour annoter vos types :

class Program
{
    static void Main(string[] args)
    {
        PlaceRoom<Room>();
        Console.ReadKey(true);
    }

    public static void PlaceRoom<T>()
        where T : Room
    {
        string name = ((NameAttribute)typeof(T).GetCustomAttributes(false).First(x => x is NameAttribute)).Name;

        Console.WriteLine(name);
    }
}

[Name("Room")]
public class Room
{
}

[Name("Bedroom")]
public class Bedroom : Room
{
}

[AttributeUsage(AttributeTargets.Class, Inherited = false)]
public class NameAttribute : Attribute
{
    public string Name { get; set; }

    public NameAttribute(string name)
    {
        Name = name;
    }
}

0voto

Arve Systad Points 3628

Si vous êtes toujours en train de remplacer (ou de créer) les propriétés et que vous ne placez jamais une propriété réelle de l Room vous pouvez rendre la pièce et toutes ses propriétés abstraites, puis faire en sorte que la signature de votre méthode soit la suivante public static void PlaceRoom<T>(T room) where T : Room et être correctement générique à ce sujet. Ensuite, laissez votre chambre, votre salle de bain et autres hériter de Room.

Si vous ajoutez de nouvelles propriétés, c'est une erreur de logique, car vous ne pouvez pas être générique pour des choses qui ne le sont pas vraiment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X