Yapmaya çalıştığınız şey mümkün, ancak önemsiz değil ve yalnızca JSON.NET'in yerleşik öznitelikleriyle yapılamaz. Özel bir özelliğe ve özel bir sözleşme çözümleyicisine ihtiyacınız olacak.
Declare bu özel özellik:
[AttributeUsage(AttributeTargets.Property)]
class JsonPropertyGenericTypeNameAttribute : Attribute
{
public int TypeParameterPosition { get; }
public JsonPropertyGenericTypeNameAttribute(int position)
{
TypeParameterPosition = position;
}
}
public class Response<T> : Response
{
[JsonPropertyGenericTypeName(0)]
public T Data { get; set; }
}
(0 Response<T>
içinde T
konumudur sizin Data
özelliğine uygulayın
İşte çözüm ben ile geldi bulunuyor Genel tür parametreleri
JsonPropertyGenericTypeName
öznitelik için bakacağız aşağıdaki sözleşme çözümleyicinizi beyan ve tip argüman gerçek adını almak:
var settings = new JsonSerializerSettings { ContractResolver = new GenericTypeNameContractResolver() };
string json = JsonConvert.SerializeObject(response, settings);
Bu verecektir: En seri ayarlarında
class GenericTypeNameContractResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var prop = base.CreateProperty(member, memberSerialization);
var attr = member.GetCustomAttribute<JsonPropertyGenericTypeNameAttribute>();
if (attr != null)
{
var type = member.DeclaringType;
if (!type.IsGenericType)
throw new InvalidOperationException($"{type} is not a generic type");
if (type.IsGenericTypeDefinition)
throw new InvalidOperationException($"{type} is a generic type definition, it must be a constructed generic type");
var typeArgs = type.GetGenericArguments();
if (attr.TypeParameterPosition >= typeArgs.Length)
throw new ArgumentException($"Can't get type argument at position {attr.TypeParameterPosition}; {type} has only {typeArgs.Length} type arguments");
prop.PropertyName = typeArgs[attr.TypeParameterPosition].Name;
}
return prop;
}
}
serialize bu resolverli Response<Foo>
{
"Foo": {
"Id": 0,
"Name": null
}
}
öznitelikler sabit değerler gerektirir. –
@ DanielA.White daha kesin, ** sabit ** değerleri. –
Bu işe yaramaz; öznitelikler sabit değerlere ihtiyaç duyar ve 'PropName' özelliğiniz yalnızca çalışma zamanında değerlendirilir. –