По сути, я пытаюсь найти что-то вроде общих ограничений для обычных аргументов, например:
public void foo( Bar x) where x : ISomething {//code that calls functionality from both Bar and ISomething. }
Однако в таком простом случае я могу просто создать класс, который расширяет Bar и реализует ISomething, используя его в качестве типа для аргумента.
Кажется, что это не работает, когда задействовано несколько интерфейсов, поскольку для каждой соответствующей комбинации интерфейсов потребуется промежуточный класс, даже если реализация в любом случае должна быть определена в производных классах.
Это только один из тех случаев, когда я должен смириться с этим и справиться с этим, или есть элегантный способ сделать это.
как код Джереми, это то, для чего предназначены дженерики, тип, о котором вы не знаете, который имеет определенные ограничения.
Это на самом деле довольно приятно. Я не знаю, почему я обесценил только использование дженериков для этого. Я не думаю, что могу принять комментарий в качестве ответа, поэтому @JeremyLakeman, если вы скопируете и вставите свой комментарий в качестве ответа, я приму его.
Обобщения могут иметь несколько ограничений, вынуждая вызывающую программу реализовывать их все. Но вам не нужно указывать, как выглядит этот тип. Например;
public void foo<T>(T x) where T : ISomething, Bar {}
foo<T>(T x) where T:ISomething,Bar
да, технически существует промежуточный тип, но все это заключено в универсальном ограничении.