556 Stimmen

Warum verbietet C# generische Attributtypen?

Dies führt zu einer Ausnahme bei der Kompilierung:

public sealed class ValidatesAttribute<T> : Attribute
{

}

[Validates<string>]
public static class StringValidation
{

}

Ich weiß, dass C# keine generischen Attribute unterstützt. Allerdings, nach viel Googeln, kann ich nicht scheinen, um den Grund zu finden.

Weiß jemand, warum sich generische Typen nicht von Attribute ? Irgendwelche Theorien?

7voto

ichiban Punkte 6153

Das ist eine sehr gute Frage. Nach meiner Erfahrung mit Attributen denke ich, dass die Einschränkung vorhanden ist, weil bei der Betrachtung eines Attributs eine Bedingung erstellt würde, bei der alle möglichen Typ-Permutationen geprüft werden müssten: typeof(Validates<string>) , typeof(Validates<SomeCustomType>) , etc...

Wenn eine benutzerdefinierte Validierung je nach Typ erforderlich ist, ist ein Attribut meiner Meinung nach nicht die beste Lösung.

Vielleicht eine Validierungsklasse, die eine SomeCustomValidationDelegate oder ein ISomeCustomValidator als Parameter wäre ein besserer Ansatz.

5voto

Owen Pauling Punkte 10598

Dies ist derzeit kein Feature der Sprache C#, aber es gibt viele Diskussionen auf der offiziellen C#-Sprachrepositorium .

から einige Sitzungsnotizen :

Obwohl dies im Prinzip funktionieren würde, gibt es Fehler in den meisten Versionen der Laufzeitumgebung, so dass es nicht richtig funktionieren würde (es wurde nie ausprobiert).

Wir brauchen einen Mechanismus, um zu verstehen, auf welcher Ziellaufzeit es funktioniert. Wir brauchen das für viele Dinge, und wir schauen uns das gerade an. Bis bis dahin können wir es nicht nehmen.

Kandidat für eine Hauptversion von C#, wenn wir eine ausreichende Anzahl von von Laufzeitversionen damit umgehen können.

-2voto

razon Punkte 3424

Meine Abhilfe sieht in etwa so aus:

public class DistinctType1IdValidation : ValidationAttribute
{
    private readonly DistinctValidator<Type1> validator;

    public DistinctIdValidation()
    {
        validator = new DistinctValidator<Type1>(x=>x.Id);
    }

    public override bool IsValid(object value)
    {
        return validator.IsValid(value);
    }
}

public class DistinctType2NameValidation : ValidationAttribute
{
    private readonly DistinctValidator<Type2> validator;

    public DistinctType2NameValidation()
    {
        validator = new DistinctValidator<Type2>(x=>x.Name);
    }

    public override bool IsValid(object value)
    {
        return validator.IsValid(value);
    }
}

...
[DataMember, DistinctType1IdValidation ]
public Type1[] Items { get; set; }

[DataMember, DistinctType2NameValidation ]
public Type2[] Items { get; set; }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X