Описание проблемы
Я пытаюсь реализовать очень специфический вид кэша объектов, который я не могу создать непосредственно (например, частные конструкторы)
Что я хочуdo читает некоторую информацию о конкретном классе, предпочтительно через некоторый интерфейс (который, к сожалению, не поддерживает статические методы, определенные для каждого подкласса)
Другими словами:
public class Data
{
public static bool Attribute1() => False;
private Data(...) { ... }
}
public class Cache<T> // T is for instance Data
{
void SomeMethod()
{
bool Value = T.Attribute1()
...
}
}
Этохорошо, если я могу заставить T наследовать от некоторого базового класса или некоторого интерфейса, и получить атрибут через какой-то метод или напрямую.Однако очень важно, чтобы я мог
- Запрограммировать несколько классов данных A и B, где A.Attribute1 () отличается от B.Attribute1 ()
- Получить атрибут изтип класса данных без создания экземпляра типа данных
Текущее решение
В настоящее время у меня есть решение в форме реестра, созданного при инициализации статических объектов, например:
class CacheAttributesRegistry
{
static RegisterAttributes(Type T, bool Attribute1, ...) { ... }
}
class Data
{
static Data() { RegisterAttributes(typeof(Data), true, ...); }
}
class Cache<T>
{
void SomeMethod()
{
bool Value = CacheAttributesRegistry.Attribute1(typeof(T));
}
}
Он делает именно то, что я хочу, но я бы предпочел избегать статического конструктора в каждом классе данных, а также я не хочу, чтобы был возможен случайный вызов RegisterAttributes
во время выполнения.
Желательно, чтобы я также избегал рефлексии, потому что хотел бы, чтобы было очевидно, как установить атрибуты для класса без магического вывода кода в фоновом режиме.
Не хватает некоторыхвариант или я только что достиг языковых ограничений?