C#中的reflection和运算符重载

这是交易。 我有一个程序将加载给定的程序集,解析所有类型及其成员并编译TreeView(非常类似于旧的MSDN站点),然后为TreeView中的每个节点构建HTML页面。 它基本上采用给定的程序集,并允许用户为文档目的创建自己的类似MSDN的库。

这是我遇到的问题:只要在定义的类中包含操作符重载,reflection就会将其作为“MethodInfo”返回,其名称设置为“op_Assign”或“op_Equality”。 我希望能够捕获这些并正确列出它们,但是我找不到返回的MethodInfo对象中的任何内容来准确识别我正在查看运算符。

我绝对不想只捕获以“op_”开头的所有内容,因为这肯定会(在某些时候)会选择一个它不应该采用的方法。 我知道像这样的“特殊情况”的其他方法和属性设置了“IsSpecialName”属性,但显然不是运算符的情况。

我一直在搜索’网络并且把我的大脑震撼了两天试图找出这个,所以任何帮助都将非常感激。

op_命名约定是.net的标准或事实标准。 反思时,我会做这样的事情:

public void GenerateDocForMethod(MethodInfo method) { if(method.Name.StartsWith("op_")) GenerateDocForOperator(method); else GenerateDocForStandardMethod(method); } public void GenerateDocForOperator(MethodInfo method) { switch(method.Name) { case "op_Addition": //generate and handle other cases... //handle methods that just happen to start with op_ default: GenerateDocForStandardMethod(method); } } public void GenerateDocForStandardMethod(MethodInfo method) { //generate doc } 

GenerateDocForOperator将打开所有可重载的运算符(不要忘记隐式和显式转换)。 如果方法名称不是标准运算符名称之一,则调用GenerateDocForStandardMethod。 我找不到操作员方法名称的详尽列表,但如果您确实需要,我可能会提供完整的列表。

编辑:这是一个可重载运算符的方法名称列表(取自http://forums.devx.com/showthread.php?55322-Operator-Overloading ….. C-can-do-it …. &p = 208952#post208952 ):

op_Implicit
op_Explicit
op_Addition
op_Subtraction
op_Multiply
op_Division
op_Modulus
op_ExclusiveOr
op_BitwiseAnd
op_BitwiseOr
op_LogicalAnd
op_LogicalOr
op_Assign
op_LeftShift
op_RightShift
op_SignedRightShift
op_UnsignedRightShift
op_Equality
op_GreaterThan
op_LessThan
op_Inequality
op_GreaterThanOrEqual
op_LessThanOrEqual
op_MultiplicationAssignment
op_SubtractionAssignment
op_ExclusiveOrAssignment
op_LeftShiftAssignment
op_ModulusAssignment
op_AdditionAssignment
op_BitwiseAndAssignment
op_BitwiseOrAssignment
op_Comma
op_DivisionAssignment
op_Decrement
op_Increment
op_UnaryNegation
op_UnaryPlus
op_OnesComplement

运算符重载确实将IsSpecialName标志设置为true。 如果你通过显式给它们一个像op_ *这样的名称来实现这些方法,那就是将flag设置为false。

要添加到Wiser的post:相同的post( http://forums.devx.com/showthread.php?55322-Operator-Overloading…..C-can-do-it….&p=208952# post208952 )提到一些额外的运营商运营商:

 Some additions - see CLI Partition 1, section 10.3. op_UnsignedRightShiftAssignment op_RightShiftAssignment op_MemberSelection op_PointerToMemberSelection op_LogicalNot op_True op_False op_AddressOf op_PointerDereference 

这些运营商都出现在公共语言基础注释标准书: http://books.google.ru/books?id=50PhgS8vjhwC&pg=PA111&lpg=PA111&dq=op_PointerToMemberSelection&source=bl&ots=vZIC0nA9sW&sig=4hTfAAWGkaKirgBQ4I1yBnK_D2M&hl=en&sa=X&ei=YsB2ULvAMuHx4QT25YCYAw&ved=0CB0Q6AEwAA#v = onepage&q = op_PointerToMemberSelection&F =假

一些方便的表也可以在这里找到: http : //en.csharp-online.net/Common_Type_System%E2%80%94Operator_Overloading