[英]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
。
如果我調試類型,我會看到this
是ConcreteEvent
類型,而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.