Обратный вызов C # для создания экземпляра класса с атрибутом

#c# #class #callback #attributes #initialization

#c# #класс #обратный вызов #атрибуты #инициализация

Вопрос:

Есть ли что-то вроде обратного вызова, когда создается экземпляр класса Foo с определенным атрибутом? Немного похоже на этот псевдокод:

 void OnObjectWithAttributeInstantiated(Type attributeType, object o) {
    // o is the object with the attribute
}
  

Итак, я пытался создать атрибут AutoStore . Представьте себе следующее:

Задан класс Foo с этим тегом:

 [AutoStore]
public class Foo { ... }
  

Затем (где-то еще в коде, неважно где) вы создаете экземпляр этого класса

 Foo f = new Foo()
  

Теперь я хочу, чтобы этот объект f был автоматически добавлен в список объектов (например, в статический класс или что-то в этом роде)

Если такого способа нет, есть ли у вас какие-нибудь идеи, как обойти проблему?

Редактировать Я не хочу использовать суперкласс, который делает это для чистого кода

С наилучшими пожеланиями, оживленный

Комментарии:

1. Я не думаю, что это возможно. Атрибуты запекаются в скомпилированный код, поэтому единственный способ узнать, что у объекта есть атрибут, — это запросить атрибуты объекта. Это, однако, такая вещь, которая postsharp.net делает.

Ответ №1:

Я не думаю, что вы можете это сделать. Потому что атрибуты доступны для обнаружения во время выполнения. Но возможным решением может быть создание фабрики для обертывания всего этого, например —

 public class Factory
{
    public static T Instantiate<T>() where T : class
    {
        // instantiate your type
        T instant = Activator.CreateInstance<T>();

        // check if the attribute is present
        if (typeof(T).GetCustomAttribute(typeof(AutoStore), false) != null)
        {
            Container.List.Add(instant);
        }
        return instant;
    }
}

public static class Container
{
    public static List<object> List { get; set; } = new List<object>();
}
  

и затем вы можете использовать его как —

 Foo foo = Factory.Instantiate<Foo>();
foo.Bar = "Some Bar";
  

Комментарии:

1. Спасибо! Немного грустно, что это невозможно, но так оно и есть. Также спасибо за вашу идею. Я буду иметь это в виду