我需要一些帮助。
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
。
已编辑!!
答案 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();
干杯!