Есть ли разумный способ в C# для достижения следующей конструкции (в псевдокоде):С атрибутами экземпляра # класса механизм
void Method(MyClass<Attribute1, Attribute2, ...> foo)
{
// here I am guaranteed that foo has the specified attributes
}
Где Attribute*
являются, например, значение перечисления, таким образом, что только экземпляры MyClass
экземпляра с атрибуты, требуемые методом, могут быть переданы методу (и в противном случае не скомпилированы)?
Я пробовал смотреть на дженерики, так как я знаю, что шаблоны C++ могут сделать эту работу таким образом, чтобы она казалась логической отправной точкой, но я не мог заставить ее работать элегантно (я попытался использовать интерфейсы для ограничения типов параметра в этот способ, но он был очень громоздким и откровенно непригодным, так как у меня есть как минимум 4 атрибута).
Я хочу сделать это, чтобы избежать множества раздражающих проверок в начале каждого метода. Я занимаюсь разработкой графики DirectX 11, поэтому я немного ограничен API, который не делает его особенно простым для передачи объектов в этом «безопасном типе» образом (в DirectX каждый ресурс имеет большую структуру «Описание», которая содержит информацию о том, что может и не может сделать ресурс, есть и нет, и т. д., и является утомительным и подверженным ошибкам анализировать, поэтому я пытаюсь написать обертку вокруг него для удобства моих и моих пользователей).
Я также не могу иметь разные типы классов для каждого случая, потому что есть много комбинаций, поэтому это кажется самым удобным способом написания кода, подобного этому, и я надеюсь, что C# сделает это возможным.
Я уверен, что есть название для этого вида функции языка (если вы знаете, пожалуйста, дайте мне знать, я бы гугл, но это своего рода трудно найти, когда вы не знаете, соответствующие ключевые слова ...)
Вы хотите разрешить передачу только определенных значений вашему методу или ваш вопрос о том, как ограничить общий метод принятием только определенных типов? – elgonzo
@elgonzo Не так много «типов», но данный класс с набором атрибутов, например. для класса текстур у меня был бы метод, который принимает только, скажем, 4-канальную текстуру с 32 битами на канал (так что это должно быть два атрибута), и метод будет принимать только экземпляры Texture, созданные с помощью «4-х каналов», и "32 бит на канал". Таким образом, это отчасти между дженериками и полномасштабным метапрограммированием, но действительно неудобно реализовывать с использованием дженериков и механизмов ковариации типов. – Thomas
Создайте тип, представляющий 4-канальные текстуры 32bpc, и ограничьте свой метод этим типом. (Наследуйте его от базового класса, который реализует обычные вещи для разных типов текстур, так что вы не получите код спагетти ...) – elgonzo