Отражения и перегрузки оператора в С#
Здесь сделка. У меня есть программа, которая загрузит данную сборку, проанализирует все типы и их членов и скомпилирует 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