将BaseType转换为派生的通用类

时间:2014-03-26 07:47:51

标签: c# generics inheritance

我需要一些帮助。

public class DerivedMessage<T> : Message where T: MyClassBase
{
    public TestMethod();
    public T Item { get; set; }
}

public class MyClassBase
{
}

public class DerivedClass: MyClassBase
{
}

public class DerivedClass2: MyClassBase
{
}

我们假设我有:

Message msg = new DerivedMessage<DerivedClass>();

是否可以在不知道其模板参数的情况下将其转换回DerivedMessage<T>

例如,创建模板MyClassBase作为模板参数:

DerivedMessage<MyClassBase> m = msg as DerivedMessage<MyClassBase>;

我的目标是获得对DerivedMessage(例如TestMethod())公共方法的访问权限,这些方法不依赖于指定的DerivedClass

已编辑!!

2 个答案:

答案 0 :(得分:1)

我认为你的继承树是错误的。在上面的示例中,MyClassBase不是DerivedMessage的基础,因此行MyClassBase msg = new DerivedMessage...甚至不应该编译。

我认为您应该将稍后需要的所有方法放入由DerivedMessage实现的界面中。以下作品:

    private interface IMessage { void Test(); }
    private class Message { }
    private class DerivedMessage<T> : Message, IMessage where T : BaseClass { public void Test() { Console.WriteLine("Test"); } };
    private class BaseClass { }
    private class DerivedClass : BaseClass{};

    static void Main(string[] args)
    {
        Message msg = new DerivedMessage<DerivedClass>();
        IMessage mess = msg as IMessage;
        mess.Test();
    }

真正的问题是:是什么阻止你尝试?

答案 1 :(得分:1)

由于您声明不依赖某个DerivedClass,我会略微更改您的设计并封装接口内的方法

public interface IMessage
{
    void TestMethod();
}

并在DerivedClass中实施:

public class DerivedClass<T> : IMessage, Message
    where T : MyClassBase
{
    // ...
}

然后使用界面与您的方法进行通信:

var message = (IMessage)msg;
message.TestMethod();

干杯!