У меня есть простой класс
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();
Наличие интерфейса в обобщенном c типе 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
.
Почему не работает приведение?