我使用 ContractResolver 解决了这个问题。我要序列化的对象列表是异构的,所以我必须向它传递两个参数,一个要序列化的属性列表,以及一个属性列表适用的类型列表。所以它看起来像这样:
public class DynamicContractResolver : DefaultContractResolver
{
private List<string> mPropertiesToSerialize = null;
private List<string> mItemTypeNames = new List<string>();
public DynamicContractResolver( List<string> propertiesToSerialize,
List<string> itemTypeNames )
{
this.mPropertiesToSerialize = propertiesToSerialize;
this.mItemTypeNames = itemTypeNames;
}
protected override IList<JsonProperty> CreateProperties( Type type, MemberSerialization memberSerialization )
{
IList<JsonProperty> properties = base.CreateProperties( type, memberSerialization );
if( this.mItemTypeNames.Contains( type.Name ) )
properties = properties.Where( p => mPropertiesToSerialize.Contains( p.PropertyName ) ).ToList();
return properties;
}
}
它是这样称呼的:
DynamicContractResolver contractResolver = new DynamicContractResolver( propsToSerialize, GetItemTypeNames() );
json = JsonConvert.SerializeObject( this, Formatting.None,
new JsonSerializerSettings { ContractResolver = contractResolver } );
GetItemTypeNames() 对列表中我要序列化的每个项目调用 GetType().Name 并将它们清楚地写入列表。
抱歉,我最初的问题含糊不清,措辞不当,如果有人有更好的解决方案,我当然不会接受这个。