私は次のように宣言されたインターフェースを持っています
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を取り、JSONデシリアライズに必要なTの具体的な実装を返します。ここでのシナリオは、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