2012-08-24 29 views
17

En mi aplicación, varios modelos necesitan Password propiedades (por ejemplo, Registration y ChangePassword modelos). La propiedad Password tiene un atributo como DataType y Required. Por lo tanto, para asegurar la reutilización de una consistencia, creé:El atributo en los miembros de la interfaz no funciona

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

Y

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

Por desgracia, los atributos no funciona.

Luego he intentado cambiar la interfaz a una clase:

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

Y

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

Ahora se está trabajando. ¿Por qué es así?

¿Por qué los atributos funcionan cuando se heredan de la clase pero no funcionan cuando se heredan de la interfaz?

+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 también útil – KyorCode

+0

@KyorCode: No pude encontrar la pregunta que publicó en el primer comentario durante la búsqueda. Incluso no en la lista de preguntas relacionadas. He marcado esta pregunta como el duplicado exacto de la pregunta que arbitró. – Mohayemin

Respuesta

20

Los atributos de las propiedades de la interfaz no se heredan en la clase, puede hacer que su interfaz sea una clase abstracta.

encontrado un answer from Microsoft:

El equipo de producto no se quiere implementar esta función, por dos razones principales:

  • Coherencia con DataAnnotations.Validator
  • Coherencia con el comportamiento de validación en ASP.Net MVC
  • escenario complicado: una clase implementa dos interfaces que tienen la misma propiedad pero con conflictos ting atributos en ellos. ¿Qué atributo tiene prioridad?
+3

Aunque se entiende en parte, es bastante decepcionante. Lo que no tiene sentido para mí: ¿por qué la herencia múltiple debería ser un problema con los atributos de propiedad, pero no con los atributos de método? ¿Y por qué el diseño del lenguaje debe estar influenciado por un determinado marco, como ASP.Net MVC, que se basa en el lenguaje? – chiccodoro

+10

Tiene sentido, a su vez, porque los atributos agregan comportamiento y las interfaces no deben definir el comportamiento. Se supone que una clase que implementa una interfaz lo hace. – chiccodoro

+7

@chiccodoro no definen el comportamiento. ellos proporcionan metainformación. un atributo en sí mismo no tendrá ningún efecto sin código adicional y, por lo tanto, no define el comportamiento. no hagamos excusas para que esta característica no exista. – Dbl

Cuestiones relacionadas