Esto parecería implicar "no". Lo cual es lamentable.
[AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class,
AllowMultiple = true, Inherited = true)]
public class CustomDescriptionAttribute : Attribute
{
public string Description { get; private set; }
public CustomDescriptionAttribute(string description)
{
Description = description;
}
}
[CustomDescription("IProjectController")]
public interface IProjectController
{
void Create(string projectName);
}
internal class ProjectController : IProjectController
{
public void Create(string projectName)
{
}
}
[TestFixture]
public class CustomDescriptionAttributeTests
{
[Test]
public void ProjectController_ShouldHaveCustomDescriptionAttribute()
{
Type type = typeof(ProjectController);
object[] attributes = type.GetCustomAttributes(
typeof(CustomDescriptionAttribute),
true);
// NUnit.Framework.AssertionException: Expected: 1 But was: 0
Assert.AreEqual(1, attributes.Length);
}
}
¿Puede una clase heredar atributos de una interfaz? ¿O estoy ladrando al árbol equivocado aquí?
c#
attributes
Roger Lipscombe
fuente
fuente
Puede definir un método de extensión útil ...
Aquí está el método de extensión:
Actualizar:
Aquí hay una versión más corta propuesta por SimonD en un comentario:
fuente
Apply
con el incorporadoForEach
deMicrosoft.Practices.ObjectBuilder2
Un artículo de Brad Wilson sobre esto: ¡Atributos de interfaz! = Atributos de clase
Para resumir: las clases no heredan de las interfaces, las implementan. Esto significa que los atributos no forman parte automáticamente de la implementación.
Si necesita heredar atributos, use una clase base abstracta, en lugar de una interfaz.
fuente
Si bien una clase C # no hereda atributos de sus interfaces, existe una alternativa útil al vincular modelos en ASP.NET MVC3.
Si declara que el modelo de la vista es la interfaz en lugar del tipo concreto, entonces la vista y el encuadernador del modelo aplicarán los atributos (por ejemplo,
[Required]
o[DisplayName("Foo")]
desde la interfaz al renderizar y validar el modelo:Luego en la vista:
fuente
Esto es más para personas que buscan extraer atributos de propiedades que pueden existir en una interfaz implementada. Debido a que esos atributos no son parte de la clase, esto le dará acceso a ellos. tenga en cuenta que tengo una clase de contenedor simple que le da acceso a PropertyInfo, ya que para eso lo necesitaba. Hackea como necesites. Esto funcionó bien para mí.
fuente
EDITAR: esto cubre la herencia de atributos de interfaces en miembros (incluidas propiedades). Hay respuestas simples arriba para las definiciones de tipo. Acabo de publicar esto porque encontré que era una limitación irritante y quería compartir una solución :)
Las interfaces son herencia múltiple y se comportan como herencia en el sistema de tipos. No hay una buena razón para este tipo de cosas. La reflexión es un poco cursi. He añadido comentarios para explicar las tonterías.
(Esto es .NET 3.5 porque resulta que es lo que está usando el proyecto que estoy haciendo en este momento).
Prueba Barebones NUnit
fuente
Agregue una interfaz con propiedades que tengan atributos / atributos personalizados adjuntos a las mismas propiedades que tiene la clase. Podemos extraer la interfaz de la clase usando la función de refactorización de Visual Studio. Haga que una clase parcial implemente esa interfaz.
Ahora obtenga el objeto "Tipo" del objeto de clase y obtenga atributos personalizados de la información de la propiedad usando getProperties en el objeto Tipo. Esto no dará los atributos personalizados en el objeto de la clase, ya que las propiedades de la clase no tenían los atributos personalizados de las propiedades de la interfaz adjuntos / heredados.
Ahora llame a GetInterface (NameOfImplemetedInterfaceByclass) en el objeto Type de la clase recuperado anteriormente. Esto proporcionará el objeto "Tipo" de la interfaz. debemos conocer el NOMBRE de la interfaz implementada. Desde el objeto Tipo, obtenga información de propiedad y si la propiedad de la interfaz tiene atributos personalizados adjuntos, la información de propiedad proporcionará una lista de atributos personalizados. La clase de implementación debe haber proporcionado la implementación de las propiedades de la interfaz. Haga coincidir el nombre de propiedad específico del objeto de clase dentro de la lista de información de propiedad de la interfaz para obtener la lista de atributos personalizados.
Esto funcionará.
fuente
Aunque mi respuesta es tardía y específica para un caso determinado, me gustaría agregar algunas ideas. Como se sugiere en otras respuestas, la Reflexión u otros métodos lo harían.
En mi caso, se necesitaba una propiedad (marca de tiempo) en todos los modelos para cumplir con ciertos requisitos (atributo de verificación de concurrencia) en un proyecto principal de Entity Framework. Podríamos agregar [] sobre todas las propiedades de la clase (agregando en la interfaz IModel qué modelos implementaron, no funcionaron). Pero ahorré tiempo a través de Fluent API, que es útil en estos casos. ¡En API fluida, puedo verificar el nombre de propiedad específico en todos los modelos y configurarlo como IsConcurrencyToken () en 1 línea!
Del mismo modo, si necesita agregar algún atributo al mismo nombre de propiedad en cientos de clases / modelos, podemos usar métodos api fluidos para resolver atributos incorporados o personalizados. Aunque la API fluida de EF (tanto core como EF6) puede usar la reflexión detrás de escena, podemos ahorrar esfuerzo :)
fuente