Отражение и перегрузки оператора в C#

Вот соглашение. У меня есть программа, которая загрузит данный блок, синтаксический анализ через все Типы и их участников и скомпилирует TreeView (очень похожий на старый сайт MSDN) и затем создаст страницы HTML для каждого узла в TreeView. Это в основном берет данный блок и позволяет пользователю создавать их собственную подобную MSDN библиотеку для него в целях документации.

Вот проблема, с которой я столкнулся: каждый раз, когда перегрузка оператора является encounted в определенном классе, отражательные возвраты что как "MethodInfo" с набором имени к чему-то как "op_Assign" или "op_Equality". Я хочу смочь получить их и перечислить их правильно, но я ничего не могу найти в объекте MethodInfo, который возвращается, чтобы точно определить, что я смотрю на оператор.

Я определенно не хочу просто получать все, что запускается с "op _", так как это будет несомненно (в какой-то момент) забирать метод, он, как не предполагается. Я знаю, что другие методы и свойства, которые являются "особыми случаями" как этот, имеют набор свойств "IsSpecialName", но appearantly это не имеет место с операторами.

Я обыскивал 'сеть и разрушал мой мозг к двум дням, пытаясь понять этого, таким образом, любая справка будет значительно цениться.

13
задан Mike U 10 June 2010 в 16:38
поделиться

2 ответа

Соглашение об именах 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

17
ответ дан 1 December 2019 в 21:51
поделиться

Перегрузки операторов действительно получают флаг IsSpecialName, установленный в true. Если же вы реализуете методы, явно дав им имя, например op_*, то флаг устанавливается в false.

5
ответ дан 1 December 2019 в 21:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: