Isso pareceria implicar "não". O que é lamentável.
[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);
}
}
Uma classe pode herdar atributos de uma interface? Ou estou latindo para a árvore errada aqui?
c#
attributes
Roger Lipscombe
fonte
fonte
Você pode definir um método de extensão útil ...
Aqui está o método de extensão:
Atualizar:
Aqui está uma versão mais curta proposta por SimonD em um comentário:
fonte
Apply
pelo integradoForEach
deMicrosoft.Practices.ObjectBuilder2
Um artigo de Brad Wilson sobre isso: Atributos de interface! = Atributos de classe
Para resumir: as classes não herdam de interfaces, elas as implementam. Isso significa que os atributos não fazem parte automaticamente da implementação.
Se você precisar herdar atributos, use uma classe base abstrata, em vez de uma interface.
fonte
Embora uma classe C # não herde atributos de suas interfaces, há uma alternativa útil ao vincular modelos na ASP.NET MVC3.
Se você declarar que o modelo da visualização é a interface em vez do tipo concreto, a visualização e o fichário do modelo aplicarão os atributos (por exemplo,
[Required]
ou[DisplayName("Foo")]
da interface ao renderizar e validar o modelo:Então, na visualização:
fonte
Isso é mais para pessoas que procuram extrair atributos de propriedades que podem existir em uma interface implementada. Como esses atributos não fazem parte da classe, você terá acesso a eles. observe, eu tenho uma classe de contêiner simples que fornece acesso a PropertyInfo - pois é para isso que eu preciso. Hacke quando você precisar. Isto funcionou bem para mim.
fonte
EDITAR: cobre a herança de atributos de interfaces em membros (incluindo propriedades). Existem respostas simples acima para definições de tipo. Acabei de postar isso porque achei uma limitação irritante e queria compartilhar uma solução :)
As interfaces são de herança múltipla e se comportam como herança no sistema de tipos. Não há um bom motivo para esse tipo de coisa. A reflexão é um pouco piegas. Eu adicionei comentários para explicar o absurdo.
(Este é o .NET 3.5 porque é simplesmente o que o projeto que estou fazendo no momento está usando.)
Teste Barebones NUnit
fonte
Adicione interface com propriedades que possuem atributos / atributos personalizados anexados às mesmas propriedades que a classe possui. Podemos extrair a interface da classe usando o recurso de refatoração do Visual Studio. Faça com que uma classe parcial implemente essa interface.
Agora obtenha o objeto "Type" do objeto de classe e obtenha atributos personalizados das informações da propriedade usando getProperties no objeto Type. Isso não fornecerá os atributos personalizados no objeto de classe, pois as propriedades da classe não tinham os atributos personalizados das propriedades da interface anexados / herdados.
Agora chame GetInterface (NameOfImplemetedInterfaceByclass) no objeto Type da classe recuperado acima. Isso fornecerá o objeto "Tipo" da interface. devemos saber o NOME da interface implementada. Do objeto Type, obtenha informações de propriedade e, se a propriedade da interface tiver algum atributo personalizado anexado, as informações de propriedade fornecerão uma lista de atributos personalizados. A classe de implementação deve ter fornecido a implementação das propriedades da interface. Combine o nome da propriedade específica do objeto de classe na lista de informações de propriedade da interface para obter a lista de atributos personalizados.
Isso vai funcionar.
fonte
Embora minha resposta seja tardia e específica para um determinado caso, gostaria de acrescentar algumas idéias. Como sugerido em outras respostas, Reflexão ou outros métodos bastariam.
No meu caso, uma propriedade (carimbo de data / hora) era necessária em todos os modelos para atender a certos requisitos (atributo de verificação de simultaneidade) em um projeto principal do framework Entity. Poderíamos adicionar [] acima de todas as propriedades de classe (adicionar na interface IModel que os modelos implementaram, não funcionou). Mas economizei tempo com a API Fluent, que é útil nesses casos. Na API fluente, posso verificar o nome da propriedade específica em todos os modelos e definir como IsConcurrencyToken () em 1 linha !!
Da mesma forma, se você precisar que qualquer atributo seja adicionado ao mesmo nome de propriedade em centenas de classes / modelos, podemos usar métodos de API fluentes para resolvedor de atributo embutido ou personalizado. Embora a API fluente EF (core e EF6) possa usar reflexão nos bastidores, podemos economizar esforços :)
fonte