按字符串名称设置/获取类属性

本文关键字:获取 属性 设置 字符串 | 更新日期: 2023-09-27 18:32:09

我要做的是使用字符串在类中设置属性的值。 例如,我的类具有以下属性:

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"

任何代码示例都非常棒。

按字符串名称设置/获取类属性

可以添加索引器属性,即伪代码

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);
        }
     }
}

可以将索引器添加到类,并使用反射来处理属性:

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;
        }
    }
}

可能是这样的?

    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>();
    }
}