转换为类型未知的泛型
Cast to generic where type is unknown
以下代码是我的简化版:
public class Message
{
public int Prop1 { get; set; }
public string Prop2 { get; set; }
}
public class ExtendedMessage<TExtension> : Message
{
public TExtension Extension { get; set; }
}
public class Processor<T> where T : Message
{
public void Process(T message)
{
}
}
我将拥有许多继承自 Message 或 ExtendedMessage 的类型。我希望能够使用处理器来处理那些继承自 ExtendedMessage<> 以及 Message 的处理器。然而,这涉及为拥有它的人操纵扩展 属性。
为了做到这一点,我似乎需要将消息参数转换为 ExtendedMessage<> 的处理方法,如果它是那种类型的话。我尝试使用以下方法做到这一点:
if (IsInstanceOfGenericType(typeof(JsonModel<>), model))
{
var dataType = message.GetType().GetGenericArguments()[0];
Type type = typeof(ExtendedMessage<>).MakeGenericType(dataType);
var extendedMsg = Activator.CreateInstance(type);
//Processing using extendedMsg.Extension
}
IsInstanceOfGenericType 来自这个答案:Testing if object is of generic type in C#
但是这不起作用,显然 属性 不可用。是否可以用相同的方法处理两种类型?我一开始就以正确的方式处理这个问题吗?如果可能,我想避免扩展 Processor 来创建一个单独的 ExtendedMessageProcessor。谢谢
简单但错误的答案是使用动态:
var extension = ((dynamic)message).Extension
更好的答案是让你的扩展继承自一个基础
public class ExtendedMessage : Message
{
public ExtensionBase Extension { get; set; }
}
public abstract class ExtensionBase
{
}
...
var extendedMessage = message as ExtendedMessage;
if (extendedMessage != null)
{
//process
}
如果这样的事情是不可能的并且你被反射困住了,你不想创建消息的新实例。您已经有了消息并且它具有您需要的属性。你应该使用 Type.GetProperties()
and Type.GetMethods()
.
以下代码是我的简化版:
public class Message
{
public int Prop1 { get; set; }
public string Prop2 { get; set; }
}
public class ExtendedMessage<TExtension> : Message
{
public TExtension Extension { get; set; }
}
public class Processor<T> where T : Message
{
public void Process(T message)
{
}
}
我将拥有许多继承自 Message 或 ExtendedMessage 的类型。我希望能够使用处理器来处理那些继承自 ExtendedMessage<> 以及 Message 的处理器。然而,这涉及为拥有它的人操纵扩展 属性。
为了做到这一点,我似乎需要将消息参数转换为 ExtendedMessage<> 的处理方法,如果它是那种类型的话。我尝试使用以下方法做到这一点:
if (IsInstanceOfGenericType(typeof(JsonModel<>), model))
{
var dataType = message.GetType().GetGenericArguments()[0];
Type type = typeof(ExtendedMessage<>).MakeGenericType(dataType);
var extendedMsg = Activator.CreateInstance(type);
//Processing using extendedMsg.Extension
}
IsInstanceOfGenericType 来自这个答案:Testing if object is of generic type in C#
但是这不起作用,显然 属性 不可用。是否可以用相同的方法处理两种类型?我一开始就以正确的方式处理这个问题吗?如果可能,我想避免扩展 Processor 来创建一个单独的 ExtendedMessageProcessor。谢谢
简单但错误的答案是使用动态:
var extension = ((dynamic)message).Extension
更好的答案是让你的扩展继承自一个基础
public class ExtendedMessage : Message
{
public ExtensionBase Extension { get; set; }
}
public abstract class ExtensionBase
{
}
...
var extendedMessage = message as ExtendedMessage;
if (extendedMessage != null)
{
//process
}
如果这样的事情是不可能的并且你被反射困住了,你不想创建消息的新实例。您已经有了消息并且它具有您需要的属性。你应该使用 Type.GetProperties()
and Type.GetMethods()
.