在使用反射的应用程序中,我有两个类
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中设置另一个Var的值?
对于公共字段,这相对简单:
object obj = InstanceOfFirstClass();
object second = obj.GetType().GetField("second").GetValue(obj);
second.GetType().GetField("anotherVar").SetValue(second, "newValue");
如果字段不是公共字段,则需要使用GetField
的重载,该重载接受设置了NonPublic
标志的BindingFlags
参数。
在.Net 4中,您可以只使用dynamic
:
dynamic obj = InstanceOfFirstClass();
obj.second.anotherVar = "newValue";
您可以在中找到读取字段并通过反射设置字段值的示例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);