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

时间:2009-12-27 09:58:03

标签: c# reflection

我有一个类的实例,我想用另一个相同类型的对象(swap)更改此实例的对象数据成员 , 由于我的系统限制,我不能使用=,new或setter操作符。

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

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

由于 约阿夫

3 个答案:

答案 0 :(得分:13)

是的,它可能。

简而言之,做一些像

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

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

不要让我接受BindingFlags(我似乎总是在第一次尝试时出错)或完全语法,但基本上就是这样。

查看System.Reflection以供参考。

答案 1 :(得分:4)

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

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

使用Fasterflect时,您不必为正确的BindingFlags规范和性能影响而烦恼(如使用反射时)。

答案 2 :(得分:0)

在vb中使用泛型,但基本的错误处理:

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

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