public interface IInterface1 {}; public interface IEtcetera {}; public struct CanUseThis : IEtcetera, IInterface1 {} public class OrThat : IEtcetera, IInterface1 {} public class Foo { private IInterface1 _object; // just pick one public void setObject(T obj) where T : IInterface1, IEtcetera { // you now *know* that object supports all the interfaces // you don't need the compiler to remind you _object = obj; } public void ExerciseObject() { // completely safe due to the constraints on setObject IEtcetera itf = (IEtcetera) _object; // .... } } public class Program { public static void Main(string[] args) { var foo = new Foo(); foo.setObject(new CanUseThis()); foo.ExerciseObject(); foo.setObject(new OrThat()); foo.ExerciseObject(); } }