简体   繁体   中英

Converting BaseType to Derived Generic Class

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM