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

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

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

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

Я чистил "сеть" и размахивал своим мозгом до двух дней, пытаясь понять это, поэтому любая помощь будет очень благодарна.

Ответ 1

Соглашение об именах op_ является стандартным стандартом или стандартом defacto для .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. Я не мог найти исчерпывающий список имен операторских методов, но я мог бы, возможно, предоставить полный список, если он вам действительно нужен.

EDIT: Вот список имен методов перегружаемых операторов (взятых из 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

Ответ 2

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

Ответ 3

Чтобы добавить к сообщению Wiser: тот же поток (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

Эти операторы видны в стандартном стандарте Common Language Infrastructure: 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=false

Некоторая удобная таблица также может быть найдена здесь: http://en.csharp-online.net/Common_Type_System%E2%80%94Operator_Overloading