16

.NET Reflection set private propertyで説明されているように、プライベート セッターを使用してプロパティを設定できます。ただし、プロパティが基本クラスで定義されている場合、System.ArgumentException がスローされます:「プロパティ セット メソッドが見つかりません」。

例は次のとおりです。

using System;
class Test
{
    public DateTime ModifiedOn { get; private set;}
}

class Derived : Test
{
}

static class Program
{
    static void Main()
    {
        Derived p = new Derived ();
        typeof(Derived).GetProperty("ModifiedOn").SetValue(
            p, DateTime.Today, null);
        Console.WriteLine(p.ModifiedOn);
    }
}

この状況に対処する方法を知っている人はいますか?

編集:与えられた例は、問題の簡単な図です。実際のシナリオでは、プロパティが基本クラスで定義されているのか、基本クラスの基本で定義されているのかわかりません。

4

4 に答える 4

20

私は、プライベート プロパティが基本クラスで宣言されているという同様の問題を抱えていました。DeclaringTypeを使用して、プロパティが定義されているクラスのハンドルを取得しました。

using System;
class Test
{
    public DateTime ModifiedOn { get; private set;}
}

class Derived : Test
{
}

static class Program
{
    static void Main()
    {
        Derived p = new Derived ();

        PropertyInfo property = p.GetType().GetProperty("ModifiedOn");
        PropertyInfo goodProperty = property.DeclaringType.GetProperty("ModifiedOn");

        goodProperty.SetValue(p, DateTime.Today, null);

        Console.WriteLine(p.ModifiedOn);
    }
}
于 2013-09-19T15:06:45.607 に答える
10

私はこれがうまくいくと思います:

using System;
class Test
{
    public DateTime ModifiedOn { get; private set;}
}

class Derived : Test
{
}

static class Program
{
    static void Main()
    {
        Derived p = new Derived ();
        typeof(Test).GetProperty("ModifiedOn").SetValue(
            p, DateTime.Today, null);
        Console.WriteLine(p.ModifiedOn);
    }
}

派生クラスではなく、実際に定義されているクラスからプロパティ定義を取得する必要があります

編集:

基本クラスでそれを選択するには、すべての親クラスでそれを探す必要があります。

このようなものは、オブジェクトにヒットするか、プロパティが見つかるまで、基本クラスに再帰します

typeof(Derived ).GetProperties().Contains(p=>p.Name == "whatever")
于 2012-04-06T09:18:24.380 に答える