如何使用C#反射Vaues设置为嵌套属性?(How to set Vaues to the Nest

2019-06-27 21:10发布

我试图将值设置为类的嵌套属性动态地使用反射。 谁能帮我做这件事。

我有一类Region像下面。

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

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

我有一个Oracle数据读取器从参考光标提供的价值。

这将给我作为

ID,姓名,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

但因为我每一次我不能抽到前面正在创建实例Country.Id如果我去的下一步Country.Name值。

有谁可以告诉分配值的objItem(that is Region).Country.IdobjItem.Country.Name 。 这意味着如何分配的,而不是创建实例,每次分配值的嵌套属性。

提前致谢。!

Answer 1:

你应该调用PropertyInfo.GetValue使用Country属性来获取国家,然后PropertyInfo.SetValue使用Id 属性对国家的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);
}


Answer 2:

取得巢特性如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]);
            }


文章来源: How to set Vaues to the Nested Property using C# Reflection.?