#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. Спасибо! Немного грустно, что это невозможно, но так оно и есть. Также спасибо за вашу идею. Я буду иметь это в виду