@@ -536,6 +536,33 @@ private static bool TryGetObjectDefaultValue(PropertyDescriptor pd, out object v
536
536
return false ;
537
537
}
538
538
539
+ private static bool TryGetObjectConditionalSerialization ( Type type , MemberDefinition memberDefinition , out MethodInfo conditionalSerializationMethodInfo )
540
+ {
541
+ conditionalSerializationMethodInfo = null ;
542
+ List < string > potentialConditionalSerializationMethodNames = new List < string >
543
+ {
544
+ "ShouldSerialize" + memberDefinition . EscapedWireName ,
545
+ "ShouldSerialize" + memberDefinition . WireName ,
546
+ "ShouldSerialize" + memberDefinition . Name
547
+ } ;
548
+ foreach ( string methodName in potentialConditionalSerializationMethodNames )
549
+ {
550
+ try
551
+ {
552
+ MethodInfo methodInfo = type . GetMethod ( methodName ) ;
553
+ if ( methodInfo != null && methodInfo . ReturnType == typeof ( bool ) && methodInfo . GetParameters ( ) . Length == 0 )
554
+ {
555
+ conditionalSerializationMethodInfo = methodInfo ;
556
+ break ;
557
+ }
558
+ }
559
+ catch ( AmbiguousMatchException ) { }
560
+ catch ( ArgumentNullException ) { }
561
+ }
562
+
563
+ return conditionalSerializationMethodInfo != null ;
564
+ }
565
+
539
566
private static string GetObjectName ( PropertyDescriptor pd , string defaultName )
540
567
{
541
568
foreach ( var att in pd . Attributes . Cast < Attribute > ( ) )
@@ -1649,6 +1676,22 @@ public virtual string EscapedWireName
1649
1676
/// </value>
1650
1677
public virtual object DefaultValue { get ; set ; }
1651
1678
1679
+ /// <summary>
1680
+ /// Gets or sets a value indicating whether this instance has conditional serialization.
1681
+ /// </summary>
1682
+ /// <value>
1683
+ /// <c>true</c> if this instance has conditional serialization; otherwise, <c>false</c>.
1684
+ /// </value>
1685
+ public virtual bool HasConditionalSerialization { get ; set ; }
1686
+
1687
+ /// <summary>
1688
+ /// Gets or sets conditional serialization method info
1689
+ /// </summary>
1690
+ /// <value>
1691
+ /// The info of the method on the type that tells whether this property should be serialized
1692
+ /// </value>
1693
+ public virtual MethodInfo ConditionalSerializationMethod { get ; set ; }
1694
+
1652
1695
/// <summary>
1653
1696
/// Gets or sets the accessor.
1654
1697
/// </summary>
@@ -3208,6 +3251,14 @@ public void WriteValues(TextWriter writer, object component, IDictionary<object,
3208
3251
continue ;
3209
3252
}
3210
3253
3254
+ if ( member . HasConditionalSerialization && member . ConditionalSerializationMethod != null )
3255
+ {
3256
+ if ( ! ( bool ) member . ConditionalSerializationMethod . Invoke ( component , new object [ ] { } ) )
3257
+ {
3258
+ continue ;
3259
+ }
3260
+ }
3261
+
3211
3262
if ( ! first )
3212
3263
{
3213
3264
writer . Write ( ',' ) ;
@@ -3400,6 +3451,8 @@ private static IEnumerable<MemberDefinition> EnumerateDefinitionsUsingReflection
3400
3451
3401
3452
ma . HasDefaultValue = TryGetObjectDefaultValue ( info , out var defaultValue ) ;
3402
3453
ma . DefaultValue = defaultValue ;
3454
+ ma . HasConditionalSerialization = TryGetObjectConditionalSerialization ( type , ma , out MethodInfo conditionalSerializationMethodInfo ) ;
3455
+ ma . ConditionalSerializationMethod = conditionalSerializationMethodInfo ;
3403
3456
ma . Accessor = ( IMemberAccessor ) Activator . CreateInstance ( typeof ( PropertyInfoAccessor < , > ) . MakeGenericType ( info . DeclaringType , info . PropertyType ) , info ) ;
3404
3457
yield return ma ;
3405
3458
}
@@ -3452,6 +3505,8 @@ private static IEnumerable<MemberDefinition> EnumerateDefinitionsUsingReflection
3452
3505
3453
3506
ma . HasDefaultValue = TryGetObjectDefaultValue ( info , out var defaultValue ) ;
3454
3507
ma . DefaultValue = defaultValue ;
3508
+ ma . HasConditionalSerialization = TryGetObjectConditionalSerialization ( type , ma , out MethodInfo conditionalSerializationMethodInfo ) ;
3509
+ ma . ConditionalSerializationMethod = conditionalSerializationMethodInfo ;
3455
3510
ma . Accessor = ( IMemberAccessor ) Activator . CreateInstance ( typeof ( FieldInfoAccessor ) , info ) ;
3456
3511
yield return ma ;
3457
3512
}
@@ -3509,6 +3564,8 @@ private static IEnumerable<MemberDefinition> EnumerateDefinitionsUsingTypeDescri
3509
3564
3510
3565
ma . HasDefaultValue = TryGetObjectDefaultValue ( descriptor , out var defaultValue ) ;
3511
3566
ma . DefaultValue = defaultValue ;
3567
+ ma . HasConditionalSerialization = TryGetObjectConditionalSerialization ( type , ma , out MethodInfo conditionalSerializationMethodInfo ) ;
3568
+ ma . ConditionalSerializationMethod = conditionalSerializationMethodInfo ;
3512
3569
ma . Accessor = ( IMemberAccessor ) Activator . CreateInstance ( typeof ( PropertyDescriptorAccessor ) , descriptor ) ;
3513
3570
yield return ma ;
3514
3571
}
0 commit comments