J'ai un attribut personnalisé, dans le constructeur de mon attribut personnalisé Je veux définir la valeur d'une propriété de mon attribut sur le type de la propriété à laquelle mon attribut a été appliqué, est-il possible d'accéder au membre appliqué à partir de l'intérieur de ma classe d'attribut?Obtenir le membre à quel attribut a été appliqué à partir du constructeur d'attribut à l'intérieur?
Obtenir le membre à quel attribut a été appliqué à partir du constructeur d'attribut à l'intérieur?
Répondre
Les attributs ne fonctionnent pas comme ça, j'ai peur. Ils sont simplement des "marqueurs", attachés à des objets, mais incapables d'interagir avec eux.
Les attributs eux-mêmes doivent généralement être dépourvus de comportement, contenant simplement des méta-données pour le type auquel ils sont attachés. Tout comportement associé à un attribut doit être fourni par une autre classe qui recherche la présence de l'attribut et effectue une tâche.
Si vous êtes intéressé par le type auquel l'attribut est appliqué, cette information sera disponible en même temps que vous réfléchissez pour obtenir l'attribut.
Comme vous le dites, ce n'est pas la fin du monde comme vous connaissez le type lors de l'obtention de l'attribut personnalisé via Reflection mais ce serait "bien" si le Type transmis à GetCustomAttribute était également stocké dans le System.Attribute –
Vous pouvez faire ensuite. C'est un exemple simple.
//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"
};
}
}
Il est possible de 4,5 .NET en utilisant CallerMemberName
:
[SomethingCustom]
public string MyProperty { get; set; }
Ensuite, votre attribut:
[AttributeUsage(AttributeTargets.Property)]
public class SomethingCustomAttribute : Attribute
{
public StartupArgumentAttribute([CallerMemberName] string propName = null)
{
// propName = "MyProperty"
}
}
- 1. initialisation de membre à l'intérieur ou à l'extérieur du constructeur
- 2. comment déterminer la date à laquelle le service pack a été appliqué à l'instance SQL Server?
- 3. Android - référence la valeur d'un attribut dans le thème actuellement appliqué à partir du code
- 4. Appel du constructeur par défaut à partir du constructeur paramétré
- 5. Comment obtenir une extension de fichier image à partir du Web lorsqu'elle a été supprimée?
- 6. Rechercher/remplacer après que le code PHP a été appliqué
- 7. À partir d'un UITypeEditor, récupérer un attribut appliqué au parent d'une propriété dans .net
- 8. Python: appelant le constructeur à partir du dictionnaire?
- 9. Le passage d'un attribut dynamique à un constructeur interne
- 10. Le contenu du widget QScrollArea a été promu à QWidget
- 11. Google Maps: Savoir à quel marqueur l'événement a été déclenché
- 12. Quel objet a été cliqué lorsqu'un événement a été déclenché?
- 13. pouvons-nous obtenir l'objet à partir duquel le focus a été volé sur le clic sur l'autre objet? ActionScript
- 14. Initialisation du constructeur à partir du cache stocké en C#
- 15. Où vérifiez-vous si un correctif de Microsoft a été appliqué à des service packs?
- 16. Javascript: quel que soit le Firefox (Firebug, quel que), comment afficher l'itinéraire à partir d'un fichier .js a été chargé?
- 17. C#: appel d'une méthode virtuelle à partir du constructeur; Conseil?
- 18. comment puis-je déterminer si SP1 a été appliqué à notre installation TFS 2008
- 19. Besoin de savoir si un widget jQuery UI a été appliqué à un objet DOM
- 20. Quel est le moyen le plus court d'affirmer qu'un attribut est appliqué à la méthode dans C#?
- 21. Déterminer quelle ligne une fonction a été exécutée à partir
- 22. a été reliée à mon projet
- 23. Est-il possible de remplacer un attribut qui a été appliqué au niveau du contrôleur sur une méthode spécifique?
- 24. Comment obtenir la propriété appartenant à un attribut personnalisé?
- 25. Comment exclure le titre du thème appliqué à l'application?
- 26. Quel est l'équivalent python du modèle Perl à suivre si quelque chose a déjà été vu?
- 27. Accès à Request.Cookies à partir d'un constructeur de contrôleur
- 28. ASP.NET: Une valeur Request.Form potentiellement dangereuse a été détectée à partir du client
- 29. Obtenir le code IL à partir du fichier binaire DLL
- 30. obtenir IHTMLStyle3 à partir du Dom of HtmlElement dans IE
Pouvez-vous décrire brièvement le cas d'utilisation? – Tanmay
Si vous pouvez fournir plus de détails sur le problème que vous résolvez, il pourrait être possible de fournir une solution alternative. –
Merci, je sais comment je peux réaliser la même chose d'une manière différente, mais je voulais savoir si cela était possible parce que le code serait plus propre. – ryudice