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

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

4

2 回答 2

2

是的 -无法设置该属性。它是只读的,大概是故意的。

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

在这种特殊情况下,如果您真的很狡猾,您可以掌握 IL 实现tring.get,确定它是从ting属性中获取的,然后通过反射调用设置器 - 但此时您将走上一条非常黑暗的道路'几乎肯定会后悔。

于 2013-04-07T08:21:46.430 回答
1

除非您知道支持字段名称是什么,否则您不能这样做。当你这样做时,你可以只设置字段值,它会反映到属性值。

考虑可能的情况并且您的财产不会由字段支持(像那样):

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

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

于 2013-04-07T08:22:01.603 回答