web-dev-qa-db-ja.com

C#リフレクションを使用してネストされたプロパティに値を設定する方法。

リフレクションを使用して、クラスのネストされたプロパティに動的に値を設定しようとしています。誰かが私がこれをするのを手伝ってもらえますか?.

私は以下のようなクラスRegionを持っています。

_public class Region
{
    public int id;
    public string name;
    public Country CountryInfo;
}

public class Country
{
    public int id;
    public string name;
}
_

Refカーソルから値を提供するOracleDataリーダーがあります。

それは私に

Id、name、Country_id、Country_name

以下により、Region.Id、Region.Nameに値を割り当てることができます。

_FieldName="id"
prop = objItem.GetType().GetProperty(FieldName, BindingFlags.Public | BindingFlags.Instance);
prop.SetValue(objItem, Utility.ToLong(reader_new[ResultName]), null);
_

また、ネストされたプロパティの場合、フィールド名を読み取ってインスタンスを作成することで、以下のように値を割り当てることができます。

_FieldName="CountryInfo.id"

if (FieldName.Contains('.'))
{
    Object NestedObject = objItem.GetType().GetProperty(Utility.Trim(FieldName.Split('.')[0]), BindingFlags.Public | BindingFlags.Instance);

    //getting the Type of NestedObject
    Type NestedObjectType = NestedObject.GetType();

    //Creating Instance
    Object Nested = Activator.CreateInstance(typeNew);

    //Getting the nested Property
    PropertyInfo nestedpropinfo = objItem.GetType().GetProperty(Utility.Trim(FieldName.Split('.')[0]), BindingFlags.Public | BindingFlags.Instance);

    PropertyInfo[] nestedpropertyInfoArray = nestedpropinfo.PropertyType.GetProperties();
    prop = nestedpropertyInfoArray.Where(p => p.Name == Utility.Trim(FieldName.Split('.')[1])).SingleOrDefault();

    prop.SetValue(Nested, Utility.ToLong(reader_new[ResultName]), null);
    Nestedprop = objItem.GetType().GetProperty(Utility.Trim(FieldName.Split('.')[0]), BindingFlags.Public | BindingFlags.Instance);

    Nestedprop.SetValue(objItem, Nested, null);
}
_

上記は_Country.Id_に値を割り当てます。

しかし、私は毎回インスタンスを作成しているので、Next Country.Nameに移動すると、前の_Country.Id_値を取得できませんでした。

誰かがobjItem(that is Region).Country.Idと_objItem.Country.Name_に値を割り当てることができると言うことができますか?これは、インスタンスを作成して毎回割り当てるのではなく、ネストされたプロパティに値を割り当てる方法を意味します。

前もって感謝します。!

20
Sravan

国を取得するには、Countryプロパティを使用してPropertyInfo.GetValueを呼び出し、次にIdプロパティを使用してPropertyInfo.SetValueを呼び出してsetのIDを取得する必要があります。国。

だからこのようなもの:

public void SetProperty(string compoundProperty, object target, object value)
{
    string[] bits = compoundProperty.Split('.');
    for (int i = 0; i < bits.Length - 1; i++)
    {
        PropertyInfo propertyToGet = target.GetType().GetProperty(bits[i]);
        target = propertyToGet.GetValue(target, null);
    }
    PropertyInfo propertyToSet = target.GetType().GetProperty(bits.Last());
    propertyToSet.SetValue(target, value, null);
}
47
Jon Skeet

Nestプロパティを取得します(例:Developer.Project.Name)

private static System.Reflection.PropertyInfo GetProperty(object t, string PropertName)
            {
                if (t.GetType().GetProperties().Count(p => p.Name == PropertName.Split('.')[0]) == 0)
                    throw new ArgumentNullException(string.Format("Property {0}, is not exists in object {1}", PropertName, t.ToString()));
                if (PropertName.Split('.').Length == 1)
                    return t.GetType().GetProperty(PropertName);
                else
                    return GetProperty(t.GetType().GetProperty(PropertName.Split('.')[0]).GetValue(t, null), PropertName.Split('.')[1]);
            }
2
Mohamed.Abdo