48 votes

C# accédant à une propriété statique de type T dans une classe générique

J'essaie de réaliser le scénario suivant selon lequel le TestClassWrapper générique pourra accéder aux propriétés statiques des classes dont il est composé (elles dériveront toutes de TestClass). Quelque chose comme:

 public class TestClass
{
    public static int x = 5;
}

public class TestClassWrapper<T> where T : TestClass
{
    public int test()
    {
        return T.x;
    }
}

Donne l'erreur : 'T' is a 'type parameter', which is not valid in the given context.

Aucune suggestion?

33voto

Jon Skeet Points 692016

Vous ne pouvez pas, au fond, du moins pas sans réflexion.

Une option consiste à mettre un délégué dans votre constructeur afin que celui qui crée une instance puisse spécifier comment y accéder :

 var wrapper = new TestClassWrapper<TestClass>(() => TestClass.x);

Vous pouvez le faire avec réflexion si nécessaire :

 public class TestClassWrapper<T> where T : TestClass
{
    private static readonly FieldInfo field = typeof(T).GetField("x");

    public int test()
    {
        return (int) field.GetValue(null);
    }
}

(Ajoutez les indicateurs de liaison appropriés si nécessaire.)

Ce n'est pas génial, mais au moins vous n'avez besoin de regarder le terrain qu'une seule fois...

8voto

cjk Points 27463

Vous pouvez sûrement écrire ceci :

 public int test() 
{ 
    return TestClass.x; 
} 

Même dans un exemple non trivial, vous ne pouvez pas remplacer un champ statique, vous l'appellerez donc toujours à partir de votre classe de base connue.

3voto

Haris Hasan Points 17497

Pourquoi ne pas simplement retourner TestClass.x ?

2voto

Marc Gravell Points 482669

Les génériques ne prennent en charge aucun élément lié aux membres statiques, cela ne fonctionnera donc pas. Mon conseil serait : ne le rendez pas statique. En supposant que le champ se rapporte réellement au T spécifique, vous pouvez également utiliser la réflexion :

 return (int) typeof(T).GetField("x").GetValue(null);

mais je ne le recommande pas.

-1voto

Bas Brekelmans Points 13799

Dans cette situation, vous supposez que T est une sous-classe de TestClass. Les sous-classes de TestClass n'auront pas l'entier statique x.

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