を試してみてくださいGetProperty(string)
メソッドを使用してアクセスできない理由現在のシナリオでは、次のクラスを使用して最初にSubProperty
フィールドを取得し、次にAddress
プロパティを取得する必要があります。
このクラスでは、適切なタイプのタイプT
を閉じることで、プロパティの戻り値の型を指定できます。次に、最初のパラメータに、オブジェクトのメンバーを抽出するだけです。 2番目のパラメータは抽出するフィールドの名前で、3番目のパラメータは値を取得しようとしているプロパティの名前です。
class SubMember<T>
{
public T Value { get; set; }
public SubMember(object source, string field, string property)
{
var fieldValue = source.GetType()
.GetField(field)
.GetValue(source);
Value = (T)fieldValue.GetType()
.GetProperty(property)
.GetValue(fieldValue, null);
}
}
コンテキスト内で目的の値を取得するには、次のコード行を実行します。
class Program
{
static void Main()
{
var t1 = new TestClass1();
Console.WriteLine(new SubMember<string>(t1, "SubProperty", "Address").Value);
}
}
これにより、Address
プロパティに含まれる値が得られます。最初に前記のプロパティに値を追加してください。
実際にクラスのフィールドをプロパティに変更する必要がある場合は、元のSubMember
クラスに次の変更を加える必要があります。
class SubMemberModified<T>
{
public T Value { get; set; }
public SubMemberModified(object source, string property1, string property2)
{
var propertyValue = source.GetType()
.GetProperty(property1)
.GetValue(source, null);
Value = (T)propertyValue.GetType()
.GetProperty(property2)
.GetValue(propertyValue, null);
}
}
このクラスでは、今、あなたはあなたの最初のクラスからプロパティを抽出し、第一の特性から抽出された第二の特性、から値を取得できるようになります。