Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#反射-更改变量字段的值_C#_Reflection - Fatal编程技术网

C#反射-更改变量字段的值

C#反射-更改变量字段的值,c#,reflection,C#,Reflection,我有一个类的实例,我只想用同一类型的另一个对象(交换)更改该实例的对象数据成员, 由于我的系统限制,我不能使用=、new或setter运算符 基本上我想改变一个变量的一个字段的值,这个字段是一个包含在另一个对象中的对象,这个变量的实例就是我拥有的 可以使用反射吗?如果有的话,有人能告诉我基本的方向吗 谢谢 是的,这是可能的 简而言之,做一些类似的事情 Type typeInQuestion = typeof(TypeHidingTheField); FieldInfo field = typeI

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

基本上我想改变一个变量的一个字段的值,这个字段是一个包含在另一个对象中的对象,这个变量的实例就是我拥有的

可以使用反射吗?如果有的话,有人能告诉我基本的方向吗

谢谢 是的,这是可能的

简而言之,做一些类似的事情

Type typeInQuestion = typeof(TypeHidingTheField);
FieldInfo field = typeInQuestion.GetField("FieldName", BindingFlags.NonPublic | BindingFlags.Instance);
field.SetValue(instanceOfObject, newValue);
更改隐藏(私有/受保护/内部)字段的值。使用相应的
FieldInfo.GetValue(…)
进行读取;将两者简单地结合起来,以获得所需的交换操作

不要让我拘泥于BindingFlags(我第一次尝试时似乎总是弄错)或确切的语法,但基本上就是这样


查看参考资料。

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

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

使用Fasterflect时,您不必为正确的BindingFlags规范和性能含义而烦恼(与使用反射时一样)。

在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(cartonclass,Integer)(cartonyoudropped,“survivingeggcount”,3)

您可以共享一些代码吗?您希望更改的值是属性还是字段?如果它是一个属性,您知道它后面字段的名称吗?-基本上,如果属性没有设置访问器,则不能更改其值(即使使用反射),但是如果属性后面有字段,即使它是私有的,也可以(通常)使用反射更改它。在某些情况下(我记不起对它的引用),您甚至可以拒绝对私有字段的反射访问。BindingFlags看起来不错,但也可能希望包含公共字段。。。BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance