![]() |
1
14
再次编辑 :这现在起作用。
在C 4中有一个很好的方法,但是你必须自己写
这在C 4中工作(测试):
编辑:这是我的测试代码。
|
![]() |
2
10
我遇到了一个类似的问题,花了我一个周末的大部分时间,但经过大量的搜索、阅读和分解C测试项目,我终于找到了答案。这个版本只需要.NET 2,而不是4。
注意里面的“如果不安全的话”。实际上我想出了两种方法,但第一种方法是…粗俗的。引用ECMA-335,IL标准文件: “与需要复制值类型以便在对象中使用的Box不同,Unbox不需要从对象中复制值类型。通常,它只计算装箱对象中已经存在的值类型的地址。” 因此,如果你想玩危险的游戏,你可以使用opcodes.unbox将你的对象句柄更改为指向你的结构的指针,然后它可以被用作stfld或callvirt的第一个参数。这样做实际上最终会在适当的地方修改结构,甚至不需要通过引用传递目标对象。 但是,请注意,标准并不能保证UNBOX会给您一个指向装箱版本的指针。特别是,它建议nullable<gt;可以导致unbox创建副本。无论如何,如果发生这种情况,您可能会得到一个静默的失败,它在本地副本上设置字段或属性值,然后立即丢弃。 这样做的安全方法是通过引用传递对象,将地址存储在一个局部变量中,进行修改,然后重新绑定结果并将其放回by ref对象参数中。 我做了一些粗略的时间安排,调用每个版本10000000次,有两种不同的结构: 带1个字段的结构: .46 S“不安全”代表 .70 S“安全”代表 4.5 s fieldinfo.setvalue设置值 包含4个字段的结构: .46 S“不安全”代表 .88 S“安全”代表 4.5 s fieldinfo.setvalue设置值 请注意,装箱使“安全”版本速度随结构大小而降低,而其他两种方法不受结构大小的影响。我想在某种程度上拳击的费用会超过反射的费用。但我不相信“不安全”版本有任何重要的作用。 |
|
3
5
经过一些实验:
与表达式树方法的主要区别在于,只读字段也可以更改。 |
![]() |
4
3
此代码适用于不使用ref的结构:
这是我的测试代码:
|
![]() |
5
1
您可能想看看动态方法(反射不一定要慢!)… 格哈德在这方面有一个很好的帖子: http://jachman.wordpress.com/2006/08/22/2000-faster-using-dynamic-method-calls/ |
![]() |
6
0
您可以很容易地修改这个来使用结构。它目前是基于词典的,但你的情况更容易。 http://www.damonpayne.com/2009/09/07/TwoWayBindingToNameValuePairs.aspx |
![]() |
JBryanB · 如何从基本抽象类访问类属性 2 年前 |
![]() |
Gabe Tucker · 无法在golang中分配接口对象指针 3 年前 |
![]() |
jkone27 · F#-在编译时从字符串生成简单的空类型 7 年前 |
![]() |
John Bustos · C#通用工厂模式,不说明通用工厂模式的类型 7 年前 |
![]() |
Randall Flagg · 访问propertyinfo中的属性 7 年前 |
![]() |
Kacper · 在反映的全名和成员c后的“*”中,“+”是什么意思# 7 年前 |
![]() |
tobeypeters · 反射铸造 7 年前 |
![]() |
myst02 · 如何在另一个方法之后调用该方法? 7 年前 |