【发布时间】:2020-03-13 15:25:22
【问题描述】:
我有一个简单的课程
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> 泛型类型的接口很重要,因为该对象将通过网络服务发送。
我做了类似的事情
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。
为什么演员不工作?
【问题讨论】:
-
您为什么期望您可以将
SomeGenericType<T>转换/转换为T?你能把List<string>转换成string吗? -
@dymanoid 我没有将
List<string>转换为string,我将具体类型ConcreteEvent转换为它的接口类型IConcreteEvent -
不,您将
SomeType<T>转换为T。这是您的代码:(T)this。在这种情况下,this是BaseEvent<T>的一个实例,您尝试将其转换为T。 -
我理解错误但我不知道如何解决这个问题
-
通常你会有一个返回
T的成员,这个成员可以用来提供构造函数参数而不是(T)this。
标签: c# generics interface casting