2013-03-20 133 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