簡體   English   中英

為什么我不能將對象轉換為其接口類型?

[英]Why cannot I cast an object to its interface type?

我有一個簡單的類

public class Message<T>
{
    public T Item { get; set; }

    public Message(T item)
    {
        Item = item;
    }
}

我想為另一組類創建一個基類型BaseEvent ,有一個方法ToMessage可以轉換為消息類,如:

IConcreteEvent event = new ConcreteEvent(...);
Message<IConcreteEvent> = event.ToMessage();

具有Message<T>的通用類型的接口很重要,因為此對象將通過 Web 服務發送。

我做了類似的事情

public interface IBaseEvent<T>
{
    Message<T> ToMessage();
}

public class BaseEvent<T> : IBaseEvent<T>
{
    public Message<T> ToMessage()
    {
        return new Message<T>((T)this); //error!
    }
}

public interface IConcreteEvent : IBaseEvent<IConcreteEvent>
{ }

public class ConcreteEvent : BaseEvent<IConcreteEvent>, IConcreteEvent
{ }

我收到錯誤Cannot convert BaseEvent<T> to T

我試圖通過這樣做來強迫這個

T value = (T)Convert.ChangeType(this, typeof(T));
return new Message<T>(value);

但我收到錯誤Object must implement IConvertible

如果我調試類型,我會看到thisConcreteEvent類型,而typeof(T)IConcreteEvent

為什么演員表不起作用?

終於找到了解決方案,但花了一些時間。

此解決方案不安全:如果類ConcreteEvent未實現其接口IConcreteEvent ,您將獲得運行時InvalidCastException和消息Unable to cast object of type 'ConcreteEvent' to type 'IConcreteEvent'

我還在類BaseEvent<T>添加了約束where T : IBaseEvent<T> BaseEvent<T>以更好地檢查類型。

ToMessage方法可以像這樣實現

object value = this;
return new Message<T>((T)value);

下面是一個完整的工作示例

void Main()
{
    IConcreteEvent e = new ConcreteEvent();
    Message<IConcreteEvent> msg = e.ToMessage();
}

public class Message<T>
{
    public T Item { get; set; }

    public Message(T item)
    {
        Item = item;
    }
}

public interface IBaseEvent<T>
{
    Message<T> ToMessage();
}

public class BaseEvent<T> : IBaseEvent<T>
    where T : IBaseEvent<T>
{
    public Message<T> ToMessage()
    {
        object value = this;
        return new Message<T>((T)value);
    }
}

public interface IConcreteEvent : IBaseEvent<IConcreteEvent>
{ }

public class ConcreteEvent : BaseEvent<IConcreteEvent>, IConcreteEvent
{ }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM