使用通用类型进行转换

use*_*190 4 c# generics casting

我很确定有一个简单的答案,围绕共同变化,但我很难看到它!

我有一个这样的课:

internal sealed class GenericCallbackClass<T> : SomeBaseClass
    where T : ICallbackMessageBase
{
    public GenericCallbackClass(string activeId, T message)
        : base(activeId)
    {
        Message = message;
    }

    public T Message { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

然后我创建一个类的实例,该类实现名为Foo的ICallbackMessageBase,并实例化一个新的GenericCallbackClass,将其作为T的参数传递,例如 var myCallback = new GenericCallback<Foo>("SomeID", new Foo())

我现在想把它转换为GenericCallbackClass的更通用的实例,因为我将有很多这样的实例与Foo,Bar等,但都实现了ICallbackMessageBase.

所以我想做点什么 var callback = myCallback as GenericCallbackClass<ICallbackMessageBase>

看来我不能做这个演员...有什么想法我应该绕过这个吗?

Eoi*_*ell 5

<T>在这种情况下,为什么你需要Generic .您的GenericCallback类中是否有其他代码可以利用<T>.否则,您可以依赖每个对象的接口实现,并确保接口定义您在Callback类中可能需要的任何公共属性或操作.

public class SomeBaseClass 
{
   public SomeBaseClass (string activeId) 
   {
       //Persist activeId
   }
}

public interface ICallbackMessageBase { /* implementation */ } 
public class Foo : ICallbackMessageBase { /* implementation */ } 

internal sealed class GenericCallbackClass : SomeBaseClass
{
    public GenericCallbackClass(string activeId, ICallbackMessageBase message)
        : base(activeId)
    {
        Message = message;
    }

    public ICallbackMessageBase Message { get; private set; }
}

void Main()
{
    var specific = new GenericCallbackClass("foo", new Foo());
}
Run Code Online (Sandbox Code Playgroud)