在C#中动态识别属性

时间:2010-12-10 10:50:00

标签: c# properties

有没有办法在C#中动态识别设计时属性?例如:

class MyClass
{
    public string MyProperty1 { get; set; }  
}

然后引用它:

string myVar = "MyProperty1";
MyClass.myVar = "test";

3 个答案:

答案 0 :(得分:6)

如果要在运行时设置属性的值,并且仅在运行时知道属性的名称,则需要使用Reflection。这是一个例子:

public class MyClass
{
    public string MyProperty1 { get; set; }
}

class Program
{
    static void Main()
    {
        // You need an instance of a class 
        // before being able to set property values            
        var myClass = new MyClass();
        string propertyName = "MyProperty1";
        // obtain the corresponding property info given a property name
        var propertyInfo = myClass.GetType().GetProperty(propertyName);

        // Before trying to set the value ensure that a property with the
        // given name exists by checking for null
        if (propertyInfo != null)
        {
            propertyInfo.SetValue(myClass, "test", null);

            // At this point you've set the value of the MyProperty1 to test 
            // on the myClass instance
            Console.WriteLine(myClass.MyProperty1);
        }

    }
}

答案 1 :(得分:1)

如何在您的班级上简单地实施索引器

public class MyClass
{
    public string MyProperty1 { get; set; }

    public object this[string propName]
    {
        get
        {
            return GetType().GetProperty(propName).GetValue(this, null);
        }
        set
        {
            GetType().GetProperty(propName).SetValue(this, value, null);
        }
    }
}

然后你可以做一些非常相似的事情

var myClass = new MyClass();
string myVar = "MyProperty1";
myClass[myVar] = "test";

答案 2 :(得分:0)

是的,当然可以。您需要获取与要设置的属性相关的FieldInfo对象。

var field = typeof(MyClass).GetField("MyProperty1");

然后从该字段信息对象中,您可以设置该类的任何实例的值。

field.SetValue(myinstanceofmyclass, "test");

有关反射可以做的其他有趣的事情,请参阅MSDN: FieldInfo