将基类型转换为派生泛型类

本文关键字:派生 泛型类 类型转换 | 更新日期: 2023-09-27 17:53:55

我需要一点帮助。

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

编辑! !

将基类型转换为派生泛型类

我认为你的继承树是错误的。在上面的示例中,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();
    }
真正的问题是:是什么让你不去尝试?

既然你说没有依赖于某个DerivedClass,我会稍微改变你的设计,并将方法封装在一个接口

public interface IMessage
{
    void TestMethod();
}

并在DerivedClass中实现:

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

然后使用接口与你的方法通信:

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

干杯!