web-dev-qa-db-fra.com

C # - Récupère les valeurs des propriétés statiques de la classe statique

J'essaie de parcourir certaines propriétés statiques dans une classe statique simple afin de remplir une zone de liste déroulante avec leurs valeurs, mais j'ai des difficultés.

Voici la classe simple:

public static MyStaticClass()
{
    public static string property1 = "NumberOne";
    public static string property2 = "NumberTwo";
    public static string property3 = "NumberThree";
}

... et le code tentant de récupérer les valeurs:

Type myType = typeof(MyStaticClass);
PropertyInfo[] properties = myType.GetProperties(
       BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly);
foreach (PropertyInfo property in properties)
{
    MyComboBox.Items.Add(property.GetValue(myType, null).ToString());
}

Si je ne fournis aucun indicateur de liaison, j'obtiens environ 57 propriétés, y compris des choses comme le module System.Reflection.Module et toutes sortes d'autres choses héritées dont je ne me soucie pas. Mes 3 propriétés déclarées ne sont pas présentes.

Si je fournis différentes combinaisons d'autres drapeaux, il renvoie toujours 0 propriétés. Génial.

Est-il important que ma classe statique soit réellement déclarée dans une autre classe non statique?

Qu'est-ce que je fais mal?

41
JamesW

Le problème est que property1..3 Ne sont pas des propriétés, mais des champs.

Pour en faire des propriétés, changez-les en:

private static string _property1 = "NumberOne";
public static string property1
{
  get { return _property1; }
  set { _property1 = value; }
}

Ou utilisez les propriétés auto et initialisez leurs valeurs dans le constructeur statique de la classe:

public static string property1 { get; set; }

static MyStaticClass()
{
  property1 = "NumberOne";
}

... ou utilisez myType.GetFields(...) si les champs sont ceux que vous souhaitez utiliser.

54
M4N

Essayez de supprimer BindingFlags.DeclaredOnly, car selon MSDN:

Spécifie que seuls les membres déclarés au niveau de la hiérarchie du type fourni doivent être pris en compte. Les membres hérités ne sont pas pris en compte.

Étant donné que les parasites statiques ne peuvent pas être hérités, cela peut être à l'origine de vos problèmes. J'ai également remarqué que les champs que vous essayez d'obtenir ne sont pas des propriétés. Essayez donc d'utiliser

type.GetFields(...)
6
Nick Berardi