public class test
{
public test()
{
ting=10;
}
private int ting{get;set;}
public int tring
{
get
{
return ting;
}
}
}
void Main()
{
var t= new test();
//Below line giving error
Console.Write(t.GetType().GetProperty("tring").SetValue(t,20));
}
如何使用反射来解决这个问题?
答案 0 :(得分:2)
是的 - 属性无法设置。这是只读的,可能是故意的。
如果班级的设计师没有给你设置值的机会,你不应该试图设置它。在许多情况下,这样做是不可能的,因为价值甚至可能不被一个字段支持(想象DateTime.Now
)或者可能以一种不可逆的方式计算(根据Marcin的回答)。
在这种特殊情况下,如果您真的狡猾,您可以抓住实施tring.get
的IL,确定它是从ting
属性获取,然后调用那个通过反思来设定 - 但那时你正走在一条非常黑暗的道路上,你几乎肯定会后悔。
答案 1 :(得分:1)
除非您知道什么是支持字段名称,否则您不能这样做。执行此操作时,您只需设置字段值,它就会反映到属性值。
考虑可能的情况,你的财产不会被一个字段支持(像那样):
public string tring
{
get
{
return string.format("foo {0} foo", ting);
}
}
set
该属性的输出应该是什么?