用C#中的泛型进行铸造

本文关键字:泛型 | 更新日期: 2023-09-27 18:09:18

给定以下片段,如何将IMessage强制转换为TMessage类型?

public void Publish<TMessage>(IMessage message) 
{
     var t = typeof(TMessage);
     MyFunction((t)message); // how can a cast message to type of TMessage?
}

用C#中的泛型进行铸造

像其他演员一样:

public void Publish<TMessage>(IMessage message) {
    var t = (TMessage)message;
    MyFunction(t);
}

编辑:若编译器说"无效强制转换",那个么可能是对的。然而,对于编译器不正确的情况,您可以"欺骗"他。

public void Publish<TMessage>(IMessage message) {
    var t = (TMessage)(object)message;
    MyFunction(t);
}
public void Publish<TMessage>(IMessage message) {
    var t = message as TMessage;
    MyFunction(t);
}

它将把t设置为null,而不是给出运行时错误。

您不需要强制转换某些参数,只需使用泛型方法即可。

// Your code
public void Publish<TMessage>(IMessage message) 
{
     var t = typeof(TMessage);
     MyFunction((t)message); // how can a cast message to type of TMessage?
}
// Modified version
public void Publish<TMessage>(TMessage message) where TMessage : IMessage
{
     MyFunction(message);
}