Сергей Губанов неоднократно подчёркивал, что в .NET невозможно эффективно реализовать обероновскую Generic Message Bus, так как классы, для которых возможно наследование, являюттся ссылочным типом, то есть медленным, а структуры не могут иметь иерархию наследования.
Однако структуры же могут реализовывать интерфейсы, которые, в свою очередь, могут реализовывать иерархии наследования (даже множественного).
Не знаю, правда, насколько эффективно реализуется такой гибрид, но как вариант для экспериментов можно попробовать, ежели кому надо:
## Код:
```
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace Test_GMB
{
    public interface ITest1
    {
        void Test1();
    }

    public interface ITest2 : ITest1
    {
        void Test2();
    }

    public interface ITest3 : ITest1
    {
        void Test3();
    }

    public struct Struct1 : ITest1
    {
        public bool bdata;

        public void Test1()
        {
            MessageBox.Show("ITest1.Test1()");
        }
    }

    public struct Struct2 : ITest2
    {
        public string sdata;

        public void Test1()
        {
            MessageBox.Show("ITest2.Test1()");
        }

        public void Test2()
        {
            MessageBox.Show("ITest2.Test2()");
        }
    }

    public struct Struct3 : ITest3
    {
        public int idata;

        public void Test1()
        {
            MessageBox.Show("ITest3.Test1()");
        }

        public void Test3()
        {
            MessageBox.Show("ITest3.Test3()");
        }
    }

    public class Test
    {
        static public void test(ITest1 strct)
        {
            if (strct is ITest2)
            {
                ((ITest2)strct).Test2();
            }
            else if (strct is ITest3)
            {
                ((ITest3)strct).Test3();
            }
            else
            {
                strct.Test1();
            }
        }

        static public void DoTest()
        {
            Struct1 s1; s1.bdata = true;
            Struct2 s2; s2.sdata = "string";
            Struct3 s3; s3.idata = 1;

            test(s1);
            test(s2);
            test(s3);
        }
    }
}
```
