2015-10-14 48 views
1

說泛型參數我有很多實現此接口的不同類別:設置從對象的變量

public interface IRequest 
{ 
    Type ResponseType { get; } 
} 

凡思想是每個請求類指定它會收到效應初探的類型。

而且我對串行/解串,其中反序列化,方法簽名是這樣一類:

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

什麼是MyBinarySerializer? –

+0

@ haim770這一個遺憾的是沒有。 – Walkingsteak

+0

https://github.com/jefffhaynes/BinarySerializer/blob/master/BinarySerializer/BinarySerializer.cs#L153 – Walkingsteak

回答

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) 
{ 
    ... 
} 
+0

這只是「修復」方法的簽名... – haim770

+0

OP沒有提供補充細節,但我認爲他控制它,所以它不應該是一個問題來實現它。 –

0

通用參數是一個設計時間類型,其屬性是一個運行時類型。您不能使用運行時類型作爲設計時間類型,但應該有一個需要某種類型的反序列化重載:

object deserialisedObject = Deserialise(Type t, Object o); 
if(deserialisedObject is MyType) 
{ 
    var property = ((MyType)deserialisedObject).MyProperty; 
} 
+0

不幸的是,我用於序列化的庫沒有非泛型的Deserialize方法,因此調用它的唯一方法是使用泛型類型參數。 – Walkingsteak