使用反射来设定的对象的属性的属性(Using reflection to set a propert

2019-07-17 13:45发布

我有两个班。

public class Class1 {
   public string value {get;set;}
}

public class Class2 {
   public Class1 myClass1Object {get;set;}
}

我有型的Class2的对象。 我需要使用反思Class2中设定值属性...即,如果我没有反映这样做,这是我会怎么做呢:

Class2 myObject = new Class2();
myObject.myClass1Object.value = "some value";

有没有一种方法,要做到以上同时使用反射来访问属性“myClass1Object.value”?

提前致谢。

Answer 1:

基本上,它分成两个属性的访问。 首先,你得到 myClass1Object属性,然后设置 value的结果属性。

显然,你需要采取的任何格式你有在属性名和分裂出来 - 例如,通过点。 例如,本应该做的任意属性深度:

public void SetProperty(object source, string property, object target)
{
    string[] bits = property.Split('.');
    for (int i=0; i < bits.Length - 1; i++)
    {
         PropertyInfo prop = source.GetType().GetProperty(bits[i]);
         source = prop.GetValue(source, null);
    }
    PropertyInfo propertyToSet = source.GetType()
                                       .GetProperty(bits[bits.Length-1]);
    propertyToSet.SetValue(source, target, null);
}

诚然,你可能需要多一点的错误比检查:)



Answer 2:

我一直在寻找的答案在哪里得到的属性值,被赋予属性名时的情况,但物业的嵌套层次是不知道。

例如。 如果输入的是“价值”,而不是提供一个完全合格的属性名称,比如“myClass1Object.value”。

你的回答启发我下面的递归解决方案:

public static object GetPropertyValue(object source, string property)
{
    PropertyInfo prop = source.GetType().GetProperty(property);
    if(prop == null)
    {
      foreach(PropertyInfo propertyMember in source.GetType().GetProperties())
      { 
         object newSource = propertyMember.GetValue(source, null);
         return GetPropertyValue(newSource, property);
      }
    }
    else
    {
       return prop.GetValue(source,null);
    }
    return null;
}


文章来源: Using reflection to set a property of a property of an object