当属性具有使用c#中的反射的getter方法时如何设置值

时间:2013-04-07 08:18:26

标签: c# reflection

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

如何使用反射来解决这个问题?

2 个答案:

答案 0 :(得分:2)

是的 - 属性无法设置。这是只读的,可能是故意的。

如果班级的设计师没有给你设置值的机会,你不应该试图设置它。在许多情况下,这样做是不可能的,因为价值甚至可能不被一个字段支持(想象DateTime.Now)或者可能以一种不可逆的方式计算(根据Marcin的回答)。

在这种特殊情况下,如果您真的狡猾,您可以抓住实施tring.get的IL,确定它是从ting属性获取,然后调用那个通过反思来设定 - 但那时你正走在一条非常黑暗的道路上,你几乎肯定会后悔。

答案 1 :(得分:1)

除非您知道什么是支持字段名称,否则您不能这样做。执行此操作时,您只需设置字段值,它就会反映到属性值。

考虑可能的情况,你的财产不会被一个字段支持(像那样):

public string tring
{
    get
    {
        return string.format("foo {0} foo", ting);
    }
}

set该属性的输出应该是什么?