2016-09-03 4 views
2

Mit C# 6 mit dem Schlüsselwort nameof(), ist es jetzt möglich, ein typsicheres Anzeigeattribut zu erstellen, das Lokalisierung verwendet. (siehe auch DisplayName attribute from Resources?)Erstellen Sie benutzerdefinierte DisplayAttribute, die ResourceType

Das Ergebnis in etwa so sein wird:

[Display(NameRes = Localization.Account.MinPasswordLength), ResourceType = typeof(Localization.Account))] 
    public int MinPasswordLength { get; set; } 

Aber danach für Dutzende von Eigenschaften eingeben, ich habe das Gefühl, es muss ein einfacherer Weg geben. Jedes Mal, wenn ich die gleiche Information zweimal (fast) tippe.

Meine Frage ist dies: Wie erstelle ich ein benutzerdefiniertes DisplayName-Attribut, die den ResourceType von den Informationen Name ableitet?

Der Code dann würde wie folgt aussehen:

[Display(NameResource = Localization.Account.MinPasswordLength)] 
    public int MinPasswordLength { get; set; } 

Jede Idee, wenn dies möglich ist? Und wenn ja: Wie?

+0

Wenn Sie die Definition überprüfen von 'DisplayAttribute' Klasse werden Sie feststellen, dass es' sealed', die bedeutet, dass Sie nicht von ihm erben können. Eine Möglichkeit wäre, Ihr benutzerdefiniertes 'DisplayNameAttribute' zu ​​erstellen, das die Informationen aus der Ressourcendatei liest. –

+0

Ja, die Klasse ist versiegelt. Das ist bedauerlich, aber vielleicht könnte es mit einer Erweiterung erreicht werden? – Frank

Antwort

0

Ein Weg könnte sein, ein anderes Attribut zu definieren, das nur den Ressourcentyp definiert.

Sie fügen dieses Attribut in die Klassendefinition ein. Und während der Ressourcensuche werden Sie den Typ Host untersuchen, um den Ressourcentyp zu bestimmen.

Beispiel:

[DisplayResourceHost(typeof(Localization.Account))] 
public class ViewModel 
{ 
    [Display(NameResource = Localization.Account.MinPasswordLength)] 
    public int MinPasswordLength { get; set; } 
} 
Verwandte Themen