Я хочу использовать генерацию кода Roslyn для генерации унарного оператора и нескольких бинарных операторов, но мне было интересно, как мне это сделать.
Допущения, Descriptor
несет с собой такую информацию, как базовыйTypeSyntax
, для которого я объявляю операторы .
До сих пор я постулировал что-то одно, только эти строки:
MemberDeclarationSyntax GenerateUnaryOperatorOverload(string methodName, SyntaxKind kind)
{
const string other = nameof(other);
var otherSyntax = Parameter(Identifier(other))
.WithType(Descriptor.Type)
;
var statementSyntax = ParseStatement($"return {otherSyntax.Identifier.ValueText}?.{methodName}();");
return OperatorDeclaration(Descriptor.Type, Token(kind))
// Assuming I need to specify Public and Static as part of the overload...
.WithModifiers(Create(Token(PublicKeyword)).Add(Token(StaticKeyword)))
.AddParameterListParameters(otherSyntax)
.WithBody(Block(statementSyntax))
;
}
как локальная функция C # ..Где methodName
- это имя метода в базовом классе, который должен быть вызван, а kind
- это оператор, например BitwiseNotExpression
(?) Для оператора Единственное дополнение .
Буквально, я хочу закончить чем-то вроде этого:
public static MyType operator ~(MyType other) => other?.BitwiseNot();
Если я смогу получить с помощью функции перегруженный оператор, тем лучше.Тем не менее, это было бы приемлемым результатом:
public static MyType operator ~(MyType other)
{
return other?.BitwiseNot();
}
Немного более старый манер кодирования, но так как сгенерированный код будет работать так же хорошо.
Затем, более или менее, промойте и повторите длябинарные операторы, то есть BitwiseOrExpression
, BitwiseAndExpression
и ExclusiveOrExpression
видов.
Мысли?Рекомендации?
Спасибо!