2012-08-24 5 views
17

Nella mia applicazione diversi modelli hanno bisogno delle proprietà Password (ad esempio, Registration e ChangePassword). La proprietà Password ha attributo come DataType e Required. Pertanto al fine di garantire di riutilizzabilità una consistenza, ho creato:L'attributo sui membri dell'interfaccia non funziona

interface IPasswordContainer{ 
    [Required(ErrorMessage = "Please specify your password")] 
    [DataType(DataType.Password)] 
    string Password { get; set; } 
} 

E

class RegistrationModel : IPasswordContainer { 
    public string Password { get; set; } 
} 

Purtroppo, gli attributi non funziona.

Poi ho provato a cambiare l'interfaccia a una classe:

public class PasswordContainer { 
    [Required(ErrorMessage = "Please specify your password")] 
    [DataType(DataType.Password)] 
    public virtual string Password { get; set; } 
} 

E

public class RegistrationModel : PasswordContainer { 
    public override string Password { get; set; } 
} 

Ora si sta lavorando. Perché è così?

Perché gli attributi funzionano se ereditati dalla classe ma non funzionano se ereditati dall'interfaccia?

+0

http://stackoverflow.com/questions/540749/can-ac-sharp-class-inherit-attributes-from-its-interface – KyorCode

+0

http://bradwilson.typepad.com/blog/2011 /08/interface-attributes-class-attributes.html anche utile – KyorCode

+0

@KyorCode: non ho trovato la domanda che hai postato nel primo commento durante la ricerca. Anche non nella lista delle domande correlate. Ho contrassegnato questa domanda come duplicato esatto della domanda che hai arbitrato. – Mohayemin

risposta

20

Gli attributi sulle proprietà dell'interfaccia non vengono ereditati dalla classe, è possibile rendere l'interfaccia una Classe astratta.

Trovato un answer from Microsoft:

Il team del prodotto non vuole implementare questa funzione, per due principali motivi:

  • Coerenza con DataAnnotations.Validator
  • coerenza con il comportamento convalida in ASP.Net MVC
  • scenario difficile: una classe implementa due interfacce che hanno la stessa proprietà, ma con conflitto attributi su di loro. Quale attributo avrà la precedenza?
+3

Anche se parzialmente compreso, è piuttosto deludente. Cosa non ha senso per me: perché l'ereditarietà multipla dovrebbe essere un problema con gli attributi delle proprietà ma non con gli attributi dei metodi? E perché la progettazione della lingua dovrebbe essere influenzata da un determinato framework come ASP.Net MVC basato sul linguaggio? – chiccodoro

+10

A suo parere, ha senso perché gli attributi aggiungono un comportamento e le interfacce non dovrebbero definire un comportamento. Una classe che implementa un'interfaccia dovrebbe farlo. – chiccodoro

+7

@chiccodoro non definiscono il comportamento. forniscono meta informazioni. un attributo di per sé non ha effetto senza codice aggiuntivo e quindi non definisce il comportamento. non facciamo scuse per questa funzione non esistente. – Dbl