假设我有许多实现此接口的不同类:
public interface IRequest
{
Type ResponseType { get; }
}
其中的想法是每个Request-class指定它将接收的响应的类型。
我有一个序列化/反序列化的类,其中deserialize-method签名是这样的:
public static T Deserialize<T>(byte[] data) where T : IRequest
{ ... }
如何调用反序列化,并使用ResponseType
变量作为通用参数?
var request = new SomeRequest() // object which implements IRequest
byte[] receivedData = myNetworkService.SendRequest(request.Serialize());
var response = MyBinarySerializer.Deserialize<request.ResponseType>(receivedData);
还是有另一种方法可以解决这个问题吗?我用于序列化/反序列化的类是第三方,所以我不能改变它。需要使用通用参数Deserialize<T>()
T
答案 0 :(得分:1)
您可以添加另一个Deserialize
的重载,该重载接受Type
参数。然后你也可以将通用调用委托给它。
public static T Deserialize<T>(byte[] data) where T : IRequest
{
return Deserialize(typeof(T), byte[] data) as T;
}
public static object Deserialize(Type, byte[] data)
{
...
}
答案 1 :(得分:0)
泛型参数是设计时类型,其中属性是运行时类型。您不能将运行时类型用作设计时类型,但是Deserialize的重载应该是一个类型:
object deserialisedObject = Deserialise(Type t, Object o);
if(deserialisedObject is MyType)
{
var property = ((MyType)deserialisedObject).MyProperty;
}