2013-03-20 237 views
3

我有一個接口聲明通C#泛型類型作爲參數

public interface ISomething<T> where T : class 

和地方在界面我有一個成員聲明爲

[JsonProperty("someProperty")] 
[JsonConverter(typeof(ConcreteTypeConverter<List<T>>))] 
List<T> SomePropertyList{ get; set; } 

我得到ConcreteTypeConverter<List<T>>一個錯誤說,它不能使用類型(T)作爲參數。我的ConcreteTypeConverter類接受一個T類型並返回一個T的具體實現,這是JSON反序列化所需要的。這裏的場景是T可以有大約20種不同的類型。但是我想避免有20個這樣的接口 - 這就是爲什麼我選擇一個通用的接口。

用法會是這樣的

ISomething<SomeType> variable = new Something<SomeType>(); 
var list = variable.SomePropertyList; 

其中SOMETYPE是T的實際執行有什麼辦法在這種情況下使用泛型?

我ConcreteConverterClass從JsonConverter派生(使用Newtonsoft.Json):

public class ConcreteTypeConverter<TConcrete> : JsonConverter 
    { 
     public override bool CanConvert(Type objectType) 
     { 
      return true; 
     } 

     public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
     { 
      serializer.Serialize(writer, value); 
     } 

     public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
     { 
      return serializer.Deserialize<TConcrete>(reader); 
     } 
    } 

我確切的錯誤是:

Attribute Argument cannot use type parameters 
+1

所以你的問題是泛型類型作爲一個屬性?你可以粘貼你的ConcreteTypeConverter代碼(只是類def)。 – 2013-03-20 10:01:51

+2

另外,確切的錯誤輸出將會很有用。 – 2013-03-20 10:22:59

+0

編輯添加額外信息的問題。是的,基本上我會將簡歷問題發送到「我可以發送泛型類型T作爲屬性嗎?」 – drl 2013-03-20 11:28:19

回答

4

你只需要ConcreteTypeConverter如果SomePropertyList沒有一個具體類型,例如

[JsonProperty("someProperty")] 
[JsonConverter(typeof(ConcreteTypeConverter<List<T>>))] 
IList<T> SomePropertyList{ get; set; } 

如果這不是一個問題,只要改變你的財產申報

[JsonProperty("someProperty")] 
List<T> SomePropertyList{ get; set; } 
0

請申請屬性上實現該接口的類。

[JsonProperty("someProperty")] 
[JsonConverter(typeof(ConcreteTypeConverter<List<T>>))] 
1

報價:

[JsonConverter(typeof(ConcreteTypeConverter<List<T>>))] 
List<T> SomePropertyList{ get; set; } 

我得到ConcreteTypeConverter

錯誤正弦E中的泛型參數不能出現在屬性的聲明,有你的一個建議,從我:

public class ConcreteTypeConverter : JsonConverter 

刪除了TConcrete。由於ReadJson返回一個對象,所以泛型的功能簡單地淡出。

其次,

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
{ 
    return serializer.Deserialize<object>(reader); 
} 

與對象替換TConcrete。如果這不足以讓您的代碼正常工作,請嘗試解決該問題。無論如何,你的方法返回一個object