Ich habe ein benutzerdefiniertes Attribut, innerhalb des Konstruktors meines benutzerdefinierten Attributs Ich möchte den Wert einer Eigenschaft meines Attributs auf den Typ der Eigenschaft festlegen, auf die mein Attribut angewendet wurde, gibt es eine Möglichkeit, auf das Element zuzugreifen, das das Attribut war angewendet auf von innerhalb meiner Attributklasse?Erhalten Mitglied, welches Attribut von innerhalb des Attributkonstruktors angewendet wurde?
Antwort
Attribute funktionieren nicht so, fürchte ich. Sie sind lediglich "Marker", die an Objekten angebracht sind, aber nicht mit ihnen interagieren können.
Attribute selbst sollten in der Regel kein Verhalten aufweisen und lediglich Metadaten für den Typ enthalten, an den sie angehängt sind. Jedes mit einem Attribut verbundene Verhalten sollte von einer anderen Klasse bereitgestellt werden, die nach dem Vorhandensein des Attributs sucht und eine Aufgabe ausführt.
Wenn Sie an dem Typ interessiert sind, auf den das Attribut angewendet wird, stehen diese Informationen zur gleichen Zeit zur Verfügung, zu der Sie reflektieren, um das Attribut zu erhalten.
Wie Sie sagen, ist es nicht das Ende der Welt, da Sie den Typ kennen, wenn Sie das benutzerdefinierte Attribut über Reflection erhalten, aber es wäre "nett", wenn der an GetCustomAttribute übergebene Type auch im System.Attribute gespeichert wäre –
Sie können als nächstes tun. Es ist ein einfaches Beispiel.
//target class
public class SomeClass{
[CustomRequired(ErrorMessage = "{0} is required", ProperytName = "DisplayName")]
public string Link { get; set; }
public string DisplayName { get; set; }
}
//custom attribute
public class CustomRequiredAttribute : RequiredAttribute, IClientValidatable
{
public string ProperytName { get; set; }
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var propertyValue = "Value";
var parentMetaData = ModelMetadataProviders.Current
.GetMetadataForProperties(context.Controller.ViewData.Model, context.Controller.ViewData.Model.GetType());
var property = parentMetaData.FirstOrDefault(p => p.PropertyName == ProperytName);
if (property != null)
propertyValue = property.Model.ToString();
yield return new ModelClientValidationRule
{
ErrorMessage = string.Format(ErrorMessage, propertyValue),
ValidationType = "required"
};
}
}
Es ist möglich, von .NET 4.5CallerMemberName
mit:
[SomethingCustom]
public string MyProperty { get; set; }
Dann wird Ihr Attribut:
[AttributeUsage(AttributeTargets.Property)]
public class SomethingCustomAttribute : Attribute
{
public StartupArgumentAttribute([CallerMemberName] string propName = null)
{
// propName = "MyProperty"
}
}
- 1. Erkennen, welches Childwindow des Vordergrundfensters angeklickt wurde?
- 2. So erhalten Sie, welches Fragment ausgewählt wurde
- 3. Mitglied Initialisierung innerhalb oder außerhalb des Konstruktors
- 4. Ein Mitglied eines Paares erhalten
- 5. Warum habe ich die Warnung "Beratung wurde nicht angewendet" erhalten?
- 6. Erhalten von String-Attribut
- 7. Ändern von Mitglied des Objekts in Map
- 8. MakeScreenshot wurde nicht korrekt gerendert, wenn der Effekt angewendet wurde
- 9. Wie kann Attribut in eckig angewendet werden?
- 10. jQuery: Welches Element wurde ausgelöst?
- 11. Auf welches Bild wurde zugegriffen?
- 12. R Shiny: Überprüfen Sie, ob und welches Dropdown-Menü innerhalb von observe() geklickt wurde.
- 13. Warum DataGridView.AutoGenerateColumns ein Browsable (false) Attribut angewendet?
- 14. Auf welches Segment einer Polylinie wurde geklickt?
- 15. Vergewissern Sie sich, dass ipconfig angewendet wurde
- 16. Finden/ersetzen, nachdem PHP-Code angewendet wurde
- 17. Herausfinden, welches Symbol in UIActivityViewController angeklickt wurde
- 18. Wie kann man wissen, welches Attribut die Validierungsregel für die Wasserlinie genannt wurde?
- 19. Wie Größe Stream zu erhalten, nachdem Filter angewendet von Lambda
- 20. Kann ein Attribut überschrieben werden, das auf Controller-Ebene für eine bestimmte Methode angewendet wurde?
- 21. erhalten Attribut von ActiveRecord Objekt von String
- 22. So finden Sie, welches Skript CSS des ausgewählten Attributs ändert
- 23. Wie Position innerhalb einer select-Anweisung erhalten
- 24. mvc5 Attribut Routing innerhalb des Bereichs kann nicht finden
- 25. Routenoptionen innerhalb von ExceptionListener erhalten
- 26. boost :: Odein genannt innerhalb Mitglied Klasse
- 27. Wie überprüft man, welches Segment verwendet wurde
- 28. Wie kann man wissen, welches Element geklickt wurde
- 29. Attribut "barLength" wurde bereits definiert
- 30. /usr/include/zconf.h Attribut wurde ----------
Können Sie kurz die Use-Case beschreiben? – Tanmay
Wenn Sie das Problem, das Sie lösen, genauer beschreiben können, ist es möglicherweise möglich, eine alternative Lösung bereitzustellen. –
Danke, ich weiß, wie ich das selbe auf andere Weise erreichen kann, aber ich wollte wissen, ob das möglich ist, weil der Code sauberer wäre. – ryudice