I need a little help with this.
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
{
}
Let's assume I have:
Message msg = new DerivedMessage<DerivedClass>();
Is there the possibility to convert it back to DerivedMessage<T>
without knowledge about its template parameter?
So for example, create template with MyClassBase
as template parameter:
DerivedMessage<MyClassBase> m = msg as DerivedMessage<MyClassBase>;
My goal is to receive access to DerivedMessage
(for example TestMethod()
) public methods which aren't dependent on the specified DerivedClass
.
Edited !!
I think your inheritance tree is wrong. In your example above MyClassBase
is not the base for DerivedMessage
, so the line MyClassBase msg = new DerivedMessage...
shouldn't even compile.
I think you should put all the methods you need later into an interface that's implemented by DerivedMessage
. The following works:
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();
}
The real question is: What keeps you from trying?
Since you are stating there is no dependency to a certain DerivedClass
, I would slightly change your design and encapsule the methods inside an interface
public interface IMessage
{
void TestMethod();
}
and implement it in DerivedClass
:
public class DerivedClass<T> : IMessage, Message
where T : MyClassBase
{
// ...
}
And then use an interface to communicate with your methods:
var message = (IMessage)msg;
message.TestMethod();
Cheers!
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.