CodeDom生成VB.NET运算符重载?

时间:2011-01-10 22:32:52

标签: vb.net operator-overloading codedom

有没有办法使用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

1 个答案:

答案 0 :(得分: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了。