Интерфейс с атрибутом

128
22 декабря 2019, 01:00

Можно ли использовать атрибуты с интерфейсами, так что бы реализующий класс имел метод с таким же атрибутом ?

Answer 1

Нет, атрибуты интерфейсов не наследуются реализующими их классами.

Если вы хотите наследуемые атрибуты, придется использовать абстрактный класс вместо интерфейса. При этом необходимо явно указать что атрибут наследуется (свойство 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

Answer 2

Да, можно: 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(){}
}
READ ALSO
Как в mesh renderer установить текстуру

Как в mesh renderer установить текстуру

Необходимо в Компонент Mesh Renderer установить текстуру из папкиНо ничего не выходит

142
динамическое создание элементов

динамическое создание элементов

поставил себе monodevelop, и, после visual studio с windows forms, gtk для меня как китайская грамота в каких-то случаях)

157
Обучение CSharp и unity и полный тупизм [закрыт]

Обучение CSharp и unity и полный тупизм [закрыт]

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение

153
Анимация кнопки в Unity2D

Анимация кнопки в Unity2D

Сделал анимацию на кнопку, но не работаетПомогите пожалуйста с данной проблемой, т

133