C#设置/由字符串名称获取类属性[复制]C#设置/由字符串名称获取类属性[复制](C# settin

2019-05-13 14:36发布

这个问题已经在这里有一个答案:

  • 使用反射在C#从字符串获取属性值 22的答案

我正在试图做的是使用字符串设定在一类属性的值。 例如,我的类具有以下特性:

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

所有字段都是字符串类型,所以我提前知道的时候,它总是一个字符串。 现在,我希望能够使用一个字符串,你可以使用DataSet对象做设置的属性。 事情是这样的:

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

理想我想只分配一个变量,然后使用该字符串名称从变量设置该属性

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

我正在读关于反思,也许是这样做的方式,但我不知道如何去设置,最多同时保持属性访问在类完好无损。 我想仍然能够使用

myClass.Name = "John"

任何代码示例将是真正伟大。

Answer 1:

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

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

        }

     }
}


Answer 2:

您可以将索引添加到您的类并使用反射来尖子属性:

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


Answer 3:

可能是这样呢?

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


文章来源: C# setting/getting the class properties by string name [duplicate]