C#Reflection – 更改变量字段的值

我有一个类的实例,我想用另一个相同类型的对象(交换)更改此实例的对象数据成员,由于我的系统约束我不能使用=,new或setter运算符。

基本上我想改变一个变量字段的值,该字段是另一个对象中包含的对象 – 我的实例所拥有的变量。

是否有可能使用reflection? 若有人可以请给我基本指示?

谢谢Yoav

是的,它可能。

简而言之,做点什么

Type typeInQuestion = typeof(TypeHidingTheField); FieldInfo field = typeInQuestion.GetField("FieldName", BindingFlags.NonPublic | BindingFlags.Instance); field.SetValue(instanceOfObject, newValue); 

更改隐藏(私有/受保护/内部)字段的值。 使用相应的FieldInfo.GetValue(...)来读取; 将这两者简单地结合起来,以获得所需的交换操作。

不要把我抱到BindingFlags(我似乎总是在第一次尝试时弄错了)或确切的语法,但基本上就是这样。

查看System.Reflection以供参考。

如果您使用.NET 3.5,则可以使用我的开源库Fasterflect通过以下代码解决该问题:

 typeof(MyType).SetField("MyField", anotherObject); 

使用Fasterflect时,您不必费心使用正确的BindingFlags规范和性能含义(如使用reflection时)。

在vb中使用generics,但是基本的error handling:

 Module somereflectionops Function GetFieldValue(Of OBTYPE, FIELDTYPE)(instance As OBTYPE, fieldname As String, Optional specbindingflags As BindingFlags = BindingFlags.NonPublic Or BindingFlags.Instance) As FIELDTYPE Dim ot As Type = GetType(OBTYPE) Dim fi As FieldInfo Try fi = ot.GetField(fieldname, BindingFlags.Default Or specbindingflags) If fi Is Nothing Then Return Nothing Return fi.GetValue(instance) Catch ex As Exception Return Nothing End Try End Function Function SetFieldValue(Of OBTYPE, FIELDTYPE)(instance As OBTYPE, fieldname As String, value As FIELDTYPE, Optional specbindingflags As BindingFlags = BindingFlags.NonPublic Or BindingFlags.Instance) As Boolean Dim ot As Type = GetType(OBTYPE) Dim fi As FieldInfo Try fi = ot.GetField(fieldname, BindingFlags.Default Or specbindingflags) If fi Is Nothing Then Return false fi.SetValue(instance, value) Return True Catch ex As Exception Return False End Try End Function End Module 

use:SetFieldValue(of cartonclass,Integer)(cartonyoudropped,“survivingeggcount”,3)