![]() |
1
3
您还可以检查IsSpecialName是否为真。这在房产中也是如此(除其他事项外) 在il级别,方法公开如下(以Environment.ExitCode为例):
如果你想变得花哨,你可以在提取出所述属性的名称后进行验证,但说实话
除了从get_或set_开始,即使对于使用讨厌名字的人来说,你也应该很好(伪造hidebysig很容易,伪造IsSpecialName会非常棘手) 然而,没有什么是可以保证的。有人可以发出一个带有set_Foo方法的类,该方法看起来就像一个真正的集合方法,但实际上不是只读属性上的集合。 除非您也检查属性CanRead/CanWrite。 这让我觉得你疯了,尽管你并不指望故意规避。 MethodInfo上执行此逻辑的简单实用程序/扩展方法不会太难,包括IsSpecialName几乎肯定能满足您的所有需求。 |
![]() |
2
0
你们中的一些人提到使用MethodBase类型的“IsSpecialName”属性。虽然对于属性“gets”或“sets”,确实会返回true,但对于运算符重载,如add_EventName或remove_EventName,也会返回true。因此,您需要检查MethodBase实例的其他属性,以确定它是否是属性访问器。不幸的是,如果你只有对MethodBase实例的引用(我认为Unity框架中的拦截行为就是这种情况),那么就没有真正的“干净”方法来确定它是属性设置器还是getter。我发现的最佳方法如下: C
VB:
|
![]() |
3
0
您可以检查IsSpecialName属性;对于属性getter和setter来说也是如此。然而,对于其他特殊方法也是如此,比如运算符重载。 |
![]() |
4
0
我不熟悉该应用程序块,但假设MethodBase属性的类型为System。反思。MethodBase,您可以查看IsSpecialName属性。 |
![]() |
5
0
虽然有点晚了,但其他人也会读到这篇文章。除了IsSpecialName和检查set_前缀(运算符有op_,event subscr./remov.有add_,remove_)外,您还可以检查方法是否与以下任何属性方法匹配:
|
![]() |
A B · C#Excel自动调整列避免长文本时出错 5 月前 |
![]() |
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 5 月前 |
![]() |
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 5 月前 |
|
Sei · Avalonia/WPF将路由器传递到控制模板 6 月前 |