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 に答える