Тема: Як створити змінну типу об'єднання кількох інтерфейсів ? (Вирішено)
Є бібліотека стороннього розробника, в тій бібліотеці є класи та інтерфейси, наприклад:
namespace SomeSpace
{
    public interface I1
    {
        void f1();
    }
    public interface I2
    {
        void f2();
    }
    public class C : I1, I2 //, ...
    {
        public void f1() { }  // implement I1.f1();
        public void f2() { }  // implement I2.f2();
        public void f3() { }  // implement other interface member.
        // ...
    }
}Я підключив цю бібліотеку до свого проекту і створив екземпляр класу C, далі я хочу помістити (присвоїти) цей екземпляр в змінну такого типу, який дозволить викликати (через крапку) будь-які властивості і методи інтерфейсів I1, I2, і не дозволить викликати інші властивості і методи класу C.
В ідеалі я б хотів, щоб це виглядало як в наступному прикладі в стрічках перед "// Error N", де N - це цифра.
using SomeSpace
namespace MySpace
{
    public interface I12 : I1, I2
    { }
    public class Program
    {
        public static void Main(string[] args)
        {
            C c = new C();
            I1 i1 = c;       // OK
            I2 i2 = c;       // OK
        //  I12 i = c;       // Error 1
        //  I1, I2 i = c;    // Error 2
        //  {I1, I2} i = c;  // Error 3
            i.f1();  // OK
            i.f2();  // OK
        //  i.f3();  // Error here is OK
        }
    }
}Звичайно, що Visual Studio на таке свариться (якщо розкоментувати рядки з Error 1, 2, 3), каже щоб я йшов туди, куди сам часто посилаю, на офіційну документацію по синтаксису.
Я знаю, що це можна реалізувати наступним способом:
using SomeSpace
namespace MySpace
{
    public interface I12 : I1, I2
    { }
    public class CC<T> : I12
        where T : I1, I2
    {
        private T _t;
        public CC(T t) { _t = t; }
        public void f1() { _t.f1(); }  // implement I1.f1();
        public void f2() { _t.f2(); }  // implement I2.f2();
    }
    public class Program
    {
        public static void Main(string[] args)
        {
            C c = new C();
            I1 i1 = c;       // OK
            I2 i2 = c;       // OK
            I12 i = new CC<C>(c);  // OK
            i.f1();  // OK
            i.f2();  // OK
        //  i.f3();  // Error here is OK
        }
    }
}Але тепер уявіть собі, що насправді інтерфейси мають не один метод, а від 20 до 50 методів. Це означає, що я мушу написати від 40 до 100 стрічок коду тільки для того, щоб досягнути поставленої цілі, і це тільки в одному класі. Дибілізм же. Гарного рішення я не знайшов.
Якщо хтось знає, як це культурно зробити, підкажіть.
