在反射中设置嵌套字段的值

时间:2013-06-22 05:22:53

标签: c# reflection

在我的应用程序中使用反射我有两个类

public class FirstClass
{
   public string someVar;
   public SecondClass second;   
   public FirstClass()
   {
      second = new SecondClass();
   }
} 

public class SecondClass
{
   public string anotherVar;
}

在我的主程序中,我有一个FirstClass实例

MainProgram()
{
   Object obj = InstanceOfFirstClass() // reflected instance of first class
}

如何在obj中设置anotherVar的值?

2 个答案:

答案 0 :(得分:2)

对于公共字段,这相对简单:

    object obj = InstanceOfFirstClass();
    object second = obj.GetType().GetField("second").GetValue(obj);
    second.GetType().GetField("anotherVar").SetValue(second, "newValue");

如果字段不公开,那么您需要使用GetField的重载,该重载需要BindingFlags参数并设置NonPublic标记。

在.Net 4中,您可以使用dynamic

dynamic obj = InstanceOfFirstClass();
obj.second.anotherVar = "newValue";

答案 1 :(得分:1)

您可以找到读取字段的示例,并通过反射设置字段的值 http://msdn.microsoft.com/en-us/library/6z33zd7h.aspx。 在你的情况下,它看起来像

    Object myObject = InstanceOfFirstClass() // reflected instance of first class
    Type myType = typeof(FirstClass);
    FieldInfo myFieldInfo = myType.GetField("second", 
        BindingFlags.Public | BindingFlags.Instance); 

    // Change the field value using the SetValue method. 
    myFieldInfo.SetValue(myObject , //myobject is the reflected instance
    value);//value is the object which u want to assign to the field);