2014-03-26 155 views
0

我需要一点帮助。将BaseType转换为派生通用类

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访问。

编辑!

回答

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(); 
    } 

真正的问题是:什么让你不尝试?

+0

是的,我固定那条线。它应该是消息msg =新 – MistyK

1

既然你声称没有依赖于一定的DerivedClass,我会稍微改变您的设计和encapsule接口

public interface IMessage 
{ 
    void TestMethod(); 
} 

内的方法和实现它在DerivedClass

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

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

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

干杯!