有没有办法在C#中动态识别设计时属性?例如:
class MyClass
{
public string MyProperty1 { get; set; }
}
然后引用它:
string myVar = "MyProperty1";
MyClass.myVar = "test";
答案 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。