Можно ли использовать атрибуты с интерфейсами, так что бы реализующий класс имел метод с таким же атрибутом ?
Нет, атрибуты интерфейсов не наследуются реализующими их классами.
Если вы хотите наследуемые атрибуты, придется использовать абстрактный класс вместо интерфейса. При этом необходимо явно указать что атрибут наследуется (свойство Inherited
в AttributeUsage
атрибута) и при его получении необходимо явно указать, что нас интересуют наследуемые атрибуты (параметр inherit
в семействе методов GetCustomAttribute[s]
):
class Program
{
static void Main(string[] args)
{
Console.WriteLine(
typeof(C1)
.GetMethod(nameof(C1.Method))
.GetCustomAttribute<InheritanceAttribute>( // <== using System.Reflection;
inherit: false) is InheritanceAttribute
); // False
Console.WriteLine(
typeof(C1)
.GetMethod(nameof(C1.Method))
.GetCustomAttribute<InheritanceAttribute>(
inherit: true) is InheritanceAttribute
); // True
Console.WriteLine(
typeof(C2)
.GetMethod(nameof(C2.Method))
.GetCustomAttribute<NonInheritanceAttribute>(
inherit: false) is NonInheritanceAttribute
); // False
Console.WriteLine(
typeof(C2)
.GetMethod(nameof(C2.Method))
.GetCustomAttribute<NonInheritanceAttribute>(
inherit: true) is NonInheritanceAttribute
); // False
Console.ReadKey();
}
}
[AttributeUsage(AttributeTargets.All, Inherited = true)]
class InheritanceAttribute : Attribute { }
[AttributeUsage(AttributeTargets.All, Inherited = false)]
class NonInheritanceAttribute : Attribute { }
abstract class AC1
{
[Inheritance]
public abstract void Method();
}
abstract class AC2
{
[NonInheritance]
public abstract void Method();
}
class C1 : AC1
{
public override void Method() { }
}
class C2 : AC2
{
public override void Method() { }
}
А вот здесь пояснение от разработчиков языка, по поводу наследования атрибутов от интерфейса: Forums: Code First DataAnnotations in Interfaces
Да, можно: https://ideone.com/gObRwA
using System;
class SomeAttribute : Attribute {}
[Some()]
interface I
{
void Method();
}
public class Test : I
{
[Some()]
public void Method() {}
public static void Main(){}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Необходимо в Компонент Mesh Renderer установить текстуру из папкиНо ничего не выходит
поставил себе monodevelop, и, после visual studio с windows forms, gtk для меня как китайская грамота в каких-то случаях)
Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение
Сделал анимацию на кнопку, но не работаетПомогите пожалуйста с данной проблемой, т