Отражение и перегрузки оператора в C # - PullRequest
12 голосов
/ 10 июня 2010

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

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

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

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

Ответы [ 3 ]

16 голосов
/ 10 июня 2010

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

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

5 голосов
/ 10 июня 2010

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

2 голосов
/ 11 октября 2012

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

Эти операторы можно найти в книге «Стандарты аннотированной инфраструктуры общего языка»:1006 *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

...