CodeDom для создания перегрузки оператора VB.NET?

Есть ли способ использовать CodeDom для создания перегруженного оператора в Vb.net? Я хочу сгенерировать это:

Public Shared Operator =(ByVal x As MyType, ByVal y As MyType) As Boolean
  Return x Is y
End Operator

Самый близкий взлом, который я могу придумать, чтобы сделать это следующим образом:

Dim eq As New CodeMemberMethod()
eq.Name = "Operator ="
eq.Parameters.Add(New CodeParameterDeclarationExpression(New CodeTypeReference("MyType"), "x"))
eq.Parameters.Add(New CodeParameterDeclarationExpression(New CodeTypeReference("MyType"), "y"))
eq.Attributes = MemberAttributes.Public Or MemberAttributes.Static
eq.ReturnType = New CodeTypeReference(GetType(Boolean))
eq.Statements.Add(New CodeMethodReturnStatement(New CodeBinaryOperatorExpression(New CodeVariableReferenceExpression("x"), CodeBinaryOperatorType.IdentityEquality, New CodeVariableReferenceExpression("y"))))
type.Members.Add(eq)

Что генерирует это, близкое, но явно неправильное:

Public Shared Function Operator =(ByVal x As MyType, ByVal y As MyType) As Boolean
    Return (x Is y)
End Function

person adam0101    schedule 10.01.2011    source источник


Ответы (1)


Я ненавижу это решение, но оно работает.

Dim eq As New CodeSnippetTypeMember("Public Shared Operator =(ByVal x As MyType, ByVal y As MyType) As Boolean" & Environment.NewLine & "Return x Is y" & Environment.NewLine & "End Operator")
type.Members.Add(eq)

Я уверен, что правильный путь имеет какое-то отношение к наследованию от CodeTypeMember для определения члена, а затем к наследованию от Microsoft.VisualBasic.VBCodeGenerator для обеспечения реализации члена, но у меня нет времени разбираться со всем этим. Думаю, пора переходить с CodeDom на T4.

person adam0101    schedule 11.01.2011
comment
Я тоже это ненавижу, но так быстрее всего добраться. - person tobsen; 19.10.2011