据我所知,没有内置的方法可以做到这一点。
您确实需要使用一点反射,并且您可能可以使用custom
JsonConverter,但是您也可以使用custom
在几行代码中做到这一点
ContractResolver:
public class GenericPropertyContractResolver : CamelCasePropertyNamesContractResolver{ private readonly Type genericTypeDefinition; public GenericPropertyContractResolver(Type genericTypeDefinition) { this.genericTypeDefinition = genericTypeDefinition; } protected override JsonProperty CreateProperty( MemberInfo member, MemberSerialization memberSerialization) { JsonProperty baseProperty = base.CreateProperty(member, memberSerialization); Type declaringType = member.DeclaringType; if (!declaringType.IsGenericType || declaringType.GetGenericTypeDefinition() != this.genericTypeDefinition) { return baseProperty; } Type declaringGenericType = declaringType.GetGenericArguments()[0]; if (IsGenericMember(member)) { baseProperty.PropertyName = this.ResolvePropertyName(declaringGenericType.Name); } return baseProperty; } // Is there a better way to do this? Determines if the member passed in // is a generic member in the open generic type. public bool IsGenericMember(MemberInfo member) { MemberInfo genericMember = this.genericTypeDefinition.GetMember(member.Name)[0]; if (genericMember != null) { if (genericMember.MemberType == MemberTypes.Field) { return ((FieldInfo)genericMember).FieldType.IsGenericParameter; } else if (genericMember.MemberType == MemberTypes.Property) { PropertyInfo property = (PropertyInfo)genericMember; return property .GetMethod .ReturnParameter .ParameterType .IsGenericParameter; } } return false; }}然后,您可以像这样使用它:
var settings = new JsonSerializerSettings();settings.ContractResolver = new GenericPropertyContractResolver(typeof(Response<>));string serialized = JsonConvert.SerializeObject(new Response<Thang> { Data = new Thang { Thing = "Hey" }}, settings);可能更直接的方法是
Dictionary在序列化类之前将其转换为。
确定封闭的泛型类型的属性是否对应于开放的泛型类型的泛型属性时,我也遇到了一些麻烦-对此的任何提示将不胜感激。
示例: https :
//dotnetfiddle.net/DejOL2



