相关疑难解决方法(0)

对结构的反思不同于类 - 但仅限于代码

代码段:

Dim target As Object
' target gets properly set to something of the desired type
Dim field As FieldInfo = target.GetType.GetField("fieldName", _
  BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.NonPublic)
field.SetValue(target,newValue)
Run Code Online (Sandbox Code Playgroud)

如果目标设置为CLASS的实例,则此代码段完美无缺.

但是,如果将target设置为STRUCTURE的实例,则代码实际上不会更改该字段的值.没有错误,但值保持不变.

而且,奇怪的是,如果我逐句通过代码,看的SetValue不能做任何事情,并立即去立即窗口,键入完全相同的setValue操作,该工程.

有关正在发生什么以及如何实际更改"代码"字段的任何建议?

编辑:

根据Jon Skeet的要求,实际代码:

Private Shared Function XmlDeserializeObject(ByVal objectType As Type, _
        ByVal deserializedID As String) As Object
    Dim result As Object
    result = CreateObject(objectType)

    mXmlR.ReadStartElement()
    Do While mXmlR.IsStartElement _
    AndAlso mXmlR.Name <> elementItem
        Dim field As FieldInfo = result.GetType.GetField(FullName, _
            BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.NonPublic) …
Run Code Online (Sandbox Code Playgroud)

vb.net .net-2.0

5
推荐指数
1
解决办法
3610
查看次数

使用反射设置C#struct/class字段时是否可以避免装箱?

假设我有一个原始值,我需要使用反射分配给某个字段.我确信该字段具有相同的原始值类型.

是否有可能以某种方式设置这个值没有拳击?

void SetFloat(object o, string name, float val)
{
  var type = o.GetType();
  var fld = type.GetField(name);
  fld.SetValue(o, val /*boxing happens here*/);
}
Run Code Online (Sandbox Code Playgroud)

PS这不是关于延迟,而是关于可能的GC压力.我正在使用Unity3D,它使用的是旧的Mono版本,而后者又使用非常优化的GC实现.每个额外的内存分配计数:(

PPS我正在构建自己的基于C#的解释器,避免反射似乎几乎不可能.

c# reflection mono boxing

5
推荐指数
1
解决办法
472
查看次数

标签 统计

.net-2.0 ×1

boxing ×1

c# ×1

mono ×1

reflection ×1

vb.net ×1