jestem generowania kodu, który trzeba sprawdzić równość użyciu SyntaxGenerator
Jak dowiedzieć się, czy rodzaj obsługuje operator równości
Próbka:
if (property.Type.IsValueType || property.Type == KnownSymbol.String)
{
if (property.Type.TypeKind == TypeKind.Enum ||
property.Type.GetMembers("op_Equality").Length == 1)
{
var valueEqualsExpression = syntaxGenerator.ValueEqualsExpression(
SyntaxFactory.ParseName("value"),
SyntaxFactory.ParseExpression(fieldAccess));
return (IfStatementSyntax)syntaxGenerator.IfStatement(valueEqualsExpression, new[] { SyntaxFactory.ReturnStatement() });
}
...
Problem jest to, że nie obsługuje typy takie jak int
.
Guess szukam czegoś podobnego SupportsValueEquals(ITypeSymbol symbol)
Jak mogę dowiedzieć się, czy rodzaj wspiera równość poprzez ==
?
Już wyodrębniasz specjalne obudowy - po prostu specjalne przypadki innych wbudowanych typów, które mają wbudowane operatory równości? –
Pamiętaj, że w każdym typie możesz mieć więcej niż jednego operatora ds. Równości. –
To naprawdę bardzo dobre pytanie, ponieważ specyfikacja C# nie ma oczywistego pojęcia "równości wartości". Istnieje równość odniesienia i istnieje określona równość, ale nie obejmuje ona wszystkich pojęć "równości wartości". Na przykład, 'Struct.Byte' nie ma' op_Equals' i 'byte' nie ma predefiniowanego operatora równości, ale zastosowanie' == 'do' byte' działa tak czy inaczej, ponieważ jest niejawna promocja 'int', która * robi * ma predefiniowana równość. Zastanawiam się, dlaczego generator składni zawraca sobie głowę tym problemem. W jaki sposób proponuje wyróżniające smaki '==' (i dlaczego)? –