Obtenir les propriétés de la classe dérivée de la classe de base
Comment puis-je obtenir les propriétés de la classe dérivée de la classe de base?
De la classe de Base:
public abstract class BaseModel {
protected static readonly Dictionary<string, Func<BaseModel, object>>
_propertyGetters = typeof(BaseModel).GetProperties().Where(p => _getValidations(p).Length != 0).ToDictionary(p => p.Name, p => _getValueGetter(p));
}
Les classes dérivées:
public class ServerItem : BaseModel, IDataErrorInfo {
[Required(ErrorMessage = "Field name is required.")]
public string Name { get; set; }
}
public class OtherServerItem : BaseModel, IDataErrorInfo {
[Required(ErrorMessage = "Field name is required.")]
public string OtherName { get; set; }
[Required(ErrorMessage = "Field SomethingThatIsOnlyHereis required.")]
public string SomethingThatIsOnlyHere{ get; set; }
}
Dans cet exemple - puis-je obtenir la propriété "Name" de ServerItem la classe tout en BaseModel classe?
EDIT:
Je suis en train de mettre en œuvre la validation du modèle, comme décrit ici:
http://weblogs.asp.net/marianor/archive/2009/04/17/wpf-validation-with-attributes-and-idataerrorinfo-interface-in-mvvm.aspx
J'ai pensé que si je créer un certain modèle de base avec (presque) tous de la validation de la magie en elle, puis d'étendre ce modèle, il sera correct...
Vous n'avez pas. C'est le point de l'ensemble..
Eh bien, vous êtes explicitement demander les propriétés de
Qu'essayez-vous de réaliser? Il est probablement possible avec la technique classique, en utilisant la réflexion de plier votre code tel qu'il est généralement très mauvais et des points à un problème de conception.
L'héritage Multiple !!! comme j'ai appris à l'université, c# ne le permet pas... ?
l'héritage multiple est autorisé lorsqu'il s'agit d'interfaces
Eh bien, vous êtes explicitement demander les propriétés de
BaseModel
. C'est vraiment pas clair ce que vous êtes en train de faire, ou de ce que vous pouvez attendre si vous avez eu d'autres classes dérivées.Qu'essayez-vous de réaliser? Il est probablement possible avec la technique classique, en utilisant la réflexion de plier votre code tel qu'il est généralement très mauvais et des points à un problème de conception.
L'héritage Multiple !!! comme j'ai appris à l'université, c# ne le permet pas... ?
l'héritage multiple est autorisé lorsqu'il s'agit d'interfaces
OriginalL'auteur Marek M. | 2013-04-05
Vous devez vous connecter pour publier un commentaire.
Si les deux classes sont dans le même assemblée, vous pouvez essayer ceci:
Ce qui va vous donner toutes les propriétés de tous les sous-classes de
BaseClass
.OriginalL'auteur pascalhein
Si vous avez besoin d'une classe dérivée de doit mettre en œuvre une méthode ou une propriété, vous devez introduire cette méthode ou propriété dans la classe de base comme une déclaration abstraite.
Par exemple, pour votre
Name
de la propriété, vous ajoutez à la classe de base:Alors toutes les classes dérivées de doit mettre en œuvre, ou être des classes abstraites elles-mêmes.
Une fois que vous avez ajouté la version abstraite de l'
Name
propriété de la classe de base, vous serez en mesure d'y accéder dans la classe de base n'importe où sauf dans la classe de base du constructeur.Pour ajouter une propriété abstraite d'une classe de base, la classe de base doit être abstraite.
En effet - et de la classe de base abstraite. Voir l'OP pour plus de détails.
OriginalL'auteur Matthew Watson
Si vous doit faire littéralement récupérer la propriété de la classe dérivée à partir de l'intérieur de la classe de base, vous pouvez utiliser la Réflexion, par exemple comme ceci...
Ce n'est pas recommandé, cependant, et vous avez très probablement devrait revoir votre conception comme Matthieu dit.
Comme pour ne pas jeter de propriétés à vos classes de base -- vous pouvez essayer de découpler la base et d'en déduire des classes dans des objets indépendants et de les transmettre via des constructeurs.
OriginalL'auteur rr-
Bon, j'ai résolu ce problème légèrement différent de ce que l'auteur de ce post: http://weblogs.asp.net/marianor/archive/2009/04/17/wpf-validation-with-attributes-and-idataerrorinfo-interface-in-mvvm.aspx
Peut-être que ça aidera quelqu'un.
OriginalL'auteur Marek M.
Scan de votre assemblée pour toutes les classes héritées de BaseModel et créer le dictionnaire comme ceci:
Désolé, mon erreur)
J'essaie de trouver une solution qui leur permettrait de m'éviter. Encore - la pensée créative 😉
OriginalL'auteur General-Doomer
OriginalL'auteur user3599701
Une autre façon de résoudre ce problème par créer virtuel propriété dans la classe de base et remplacer à la classe dérivée.
OriginalL'auteur mayank