Utiliser la réflexion pour obtenir l'attribut d'une propriété via la méthode dite de l'incubateur
Note: Ceci est suivi d'une réponse sur un question précédente.
Je suis la décoration d'une propriété de définition de la avec un Attribut appelé TestMaxStringLength
qui est utilisé dans la méthode appelée à partir de la définition pour la validation.
Le bien est actuellement ressemble à ceci:
public string CompanyName
{
get
{
return this._CompanyName;
}
[TestMaxStringLength(50)]
set
{
this.ValidateProperty(value);
this._CompanyName = value;
}
}
Mais je préférerais qu'il ressemble à ceci:
[TestMaxStringLength(50)]
public string CompanyName
{
get
{
return this._CompanyName;
}
set
{
this.ValidateProperty(value);
this._CompanyName = value;
}
}
Le code pour ValidateProperty
qui est responsable de la recherche les attributs de l'incubateur est:
private void ValidateProperty(string value)
{
var attributes =
new StackTrace()
.GetFrame(1)
.GetMethod()
.GetCustomAttributes(typeof(TestMaxStringLength), true);
//Use the attributes to check the length, throw an exception, etc.
}
Comment puis-je changer la ValidateProperty
code pour les attributs sur la propriété au lieu de la la méthode de jeu?
Vous devez vous connecter pour publier un commentaire.
Autant que je sache, il n'y a aucun moyen d'obtenir un PropertyInfo à partir d'un MethodInfo de l'un de ses compositeurs. Si, bien sûr, vous pouvez utiliser une chaîne de caractères hacks, comme l'utilisation du nom pour la recherche et par exemple. Je suis en train de penser à quelque chose comme:
Inutile de dire que, si, c'est vraiment pas performant.
Aussi, être prudent avec la StackTrace de classe - c'est une performance de porcs, aussi, lorsqu'il est utilisé trop souvent.
Dans la classe qui déclare la méthode, vous pouvez rechercher la propriété qui contient le setter. Il n'est pas performant, mais ce n'est
StackTrace
.Vous pourriez envisager, comme une approche alternative, le fait de retarder la validation jusqu'à ce que plus tard, supprimant ainsi la nécessité de contrôler la trace de la pile.
Cet exemple fournit un attribut...
... un POCO avec l'attribut appliqué à une propriété...
... et un utilitaire de la classe de stub qui valide l'objet.