92

私がやろうとしているのは、文字列を使用してクラスのプロパティの値を設定することです。たとえば、私のクラスには次のプロパティがあります。

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

すべてのフィールドはstring型であるため、常に文字列であることが事前にわかっています。ここで、オブジェクトの場合と同じように、文字列を使用してプロパティを設定できるようにしたいと考えていDataSetます。このようなもの:

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

理想的には、変数を割り当ててから、変数の文字列名を使用してプロパティを設定したいだけです。

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

私はリフレクションについて読んでいましたが、おそらくそれがそれを行う方法ですが、クラスでプロパティへのアクセスをそのまま維持しながらそれを設定する方法がわかりません。私はまだ使用できるようにしたい:

myClass.Name = "John"

どんなコード例も本当に素晴らしいでしょう。

4

3 に答える 3

142

インデクサープロパティ、擬似コードを追加できます。

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);
        }
     }
}
于 2012-04-23T15:15:25.737 に答える
5

クラスにインデクサーを追加し、リフレクションを使用してプロパティを取得できます。

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;
        }
    }
}
于 2012-04-23T15:25:53.350 に答える
-2

このようなものでしょうか?

    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>();
    }
}
于 2012-04-23T15:17:40.273 に答える