Если вы хотите ограничить свой метод SetFoo
только теми параметрами, которые реализуют эти два интерфейса, то вы в удаче:
public void SetFoo<T>(T value) where T : IFirstInterface, ISecondInterface
{
_foo = value;
}
С этого момента, в любой момент, когда вы захотите получить доступ к вашему члену _foo
в качестве одного из этих двух интерфейсов, вам просто нужно будет получить к нему доступ с помощью приведений: (IFirstInterface)_foo
или (ISecondInterface)_foo
соответственно.
Вы сказали, что хотели бы избежать использования приведений для безопасности во время компиляции; но я думаю, что если вы найдете способ обеспечить инициализацию _foo
, используя SetFoo
выше, вы можете разыграть все, что хотите, с душевным спокойствием.
Я только что понял, что ниже описывается то, что вы конкретно указали в вопросе, который вы не хотели бы сделать. Итак, я говорю, пойти с вышеупомянутым.
Другой идеей было бы, поскольку, похоже, этот _foo
объект является членом класса (я основываю это предположение на _
в имени переменной), вы можете определить свой класс следующим образом:
class YourClassThatHasAFoo<T> where T : IFirstInterface, ISecondInterface {
private T _foo;
public void SetFoo(T value) {
_foo = value;
}
}
То, имеет ли это смысл, очевидно, зависит от вашего конкретного сценария. Вам определенно придется обдумать это, поскольку классы с такими ограничениями иногда приводят к проблемам, которые вы, возможно, не ожидали в будущем (например, SetFoo
сейчас должен принимать параметр типа T
, а не просто любой класс, который реализует ваши два интерфейса).