从对象的变量设置泛型参数

时间:2015-10-14 11:44:57

标签: c# generics generic-programming

假设我有许多实现此接口的不同类:

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

2 个答案:

答案 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;
}