92 votes

Définition et récupération des propriétés de la classe par le nom de la chaîne

Ce que j'essaie de faire, c'est de définir la valeur de la propriété dans une classe en utilisant une chaîne de caractères. Par exemple, ma classe a les propriétés suivantes :

myClass.Name
myClass.Address
myClass.PhoneNumber
myClass.FaxNumber

Tous les champs sont de string afin de savoir à l'avance qu'il s'agit toujours d'une chaîne de caractères. Maintenant, je veux pouvoir définir les propriétés à l'aide d'une chaîne de caractères, comme vous pourriez le faire avec un fichier de type DataSet objet. Quelque chose comme ça :

myClass["Name"] = "John"
myClass["Address"] = "1112 River St., Boulder, CO"

Idéalement, je veux simplement affecter une variable, puis définir la propriété en utilisant le nom de la chaîne de la variable :

string propName = "Name"
myClass[propName] = "John"

J'ai lu des articles sur la réflexion et c'est peut-être la façon de procéder, mais je ne suis pas sûr de la façon de procéder tout en conservant l'accès aux propriétés intactes dans la classe. Je veux pouvoir continuer à utiliser :

myClass.Name = "John"

Tout exemple de code serait le bienvenu.

144voto

Tigran Points 41381

Vous pouvez ajouter une propriété d'indexation, une pseudo-code :

public class MyClass 
{
     public object this[string propertyName] 
     {
        get
        {
           // probably faster without reflection:
           // like:  return Properties.Settings.Default.PropertyValues[propertyName] 
           // instead of the following
           Type myType = typeof(MyClass);                   
           PropertyInfo myPropInfo = myType.GetProperty(propertyName);
           return myPropInfo.GetValue(this, null);
        }
        set
        {
           Type myType = typeof(MyClass);                   
           PropertyInfo myPropInfo = myType.GetProperty(propertyName);
           myPropInfo.SetValue(this, value, null);
        }
     }
}

5voto

Dennis Traub Points 24186

Vous pouvez ajouter un indexeur à votre classe et utiliser la réflexion pour accéder aux propriétés :

using System.Reflection;

public class MyClass {

    public object this[string name]
    {
        get
        {
            var properties = typeof(MyClass)
                    .GetProperties(BindingFlags.Public | BindingFlags.Instance);

            foreach (var property in properties)
            {
                if (property.Name == name && property.CanRead)
                    return property.GetValue(this, null);
            }

            throw new ArgumentException("Can't find property");

        }
        set {
            return;
        }
    }
}

-2voto

Deitro Points 257

Peut-être quelque chose comme ça ?

    public class PropertyExample
{
    private readonly Dictionary<string, string> _properties;

    public string FirstName
    {
        get { return _properties["FirstName"]; }
        set { _properties["FirstName"] = value; }
    }

    public string LastName
    {
        get { return _properties["LastName"]; }
        set { _properties["LastName"] = value; }
    }
    public string this[string propertyName]
    {
        get { return _properties[propertyName]; }
        set { _properties[propertyName] = value; }
    }

    public PropertyExample()
    {
        _properties = new Dictionary<string, string>();
    }
}

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