Skip to content

Commit

Permalink
Merge pull request #104 from RedX2501/thread-safe-propchanged
Browse files Browse the repository at this point in the history
Create a thread safe OnPropertyChanged event method.
  • Loading branch information
mganss authored Mar 11, 2019
2 parents bf49971 + 3353721 commit 59cc0ba
Showing 1 changed file with 17 additions and 24 deletions.
41 changes: 17 additions & 24 deletions XmlSchemaClassGenerator/TypeModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ private static DocumentationModel GetSingleDoc(IEnumerable<DocumentationModel> d
}
}

[DebuggerDisplay("{Name}")]
public abstract class TypeModel
{
protected static readonly CodeDomProvider CSharpProvider = CodeDomProvider.CreateProvider("CSharp");
Expand Down Expand Up @@ -286,12 +287,13 @@ public override CodeTypeDeclaration Generate()

if (Configuration.EnableDataBinding)
{
classDeclaration.Members.Add(new CodeMemberEvent()
var propertyChangedEvent = new CodeMemberEvent()
{
Name = "PropertyChanged",
Type = new CodeTypeReference(typeof(PropertyChangedEventHandler), Configuration.CodeTypeReferenceOptions),
Attributes = MemberAttributes.Public,
});
};
classDeclaration.Members.Add(propertyChangedEvent);

var onPropChangedMethod = new CodeMemberMethod
{
Expand All @@ -300,19 +302,9 @@ public override CodeTypeDeclaration Generate()
};
var param = new CodeParameterDeclarationExpression(typeof(string), "propertyName");
onPropChangedMethod.Parameters.Add(param);
onPropChangedMethod.Statements.Add(
new CodeConditionStatement(
new CodeBinaryOperatorExpression(
new CodeEventReferenceExpression(null, "PropertyChanged"),
CodeBinaryOperatorType.IdentityInequality,
new CodePrimitiveExpression(null)),
new CodeExpressionStatement(new CodeDelegateInvokeExpression(
new CodeEventReferenceExpression(null, "PropertyChanged"),
new CodeThisReferenceExpression(),
new CodeObjectCreateExpression(
"PropertyChangedEventArgs",
new CodeArgumentReferenceExpression("propertyName"))
))));
var threadSafeDelegateInvokeExpression = new CodeSnippetExpression($"{propertyChangedEvent.Name}?.Invoke(this, new PropertyChangedEventArgs({param.Name}))");

onPropChangedMethod.Statements.Add(threadSafeDelegateInvokeExpression);
classDeclaration.Members.Add(onPropChangedMethod);
}

Expand Down Expand Up @@ -495,6 +487,7 @@ public override CodeExpression GetDefaultValueFor(string defaultString, bool att
}
}

[DebuggerDisplay("{Name}")]
public class PropertyModel
{
public TypeModel OwningType { get; set; }
Expand Down Expand Up @@ -542,7 +535,7 @@ internal static string GetAccessors(string memberName, string backingFieldName,
if (!{0}.Equals(value))
{{
{0} = value;
OnPropertyChanged(""{1}"");
OnPropertyChanged(nameof({1}));
}}
}}
}}", backingFieldName, memberName, (privateSetter ? "private " : string.Empty)));
Expand All @@ -560,7 +553,7 @@ internal static string GetAccessors(string memberName, string backingFieldName,
if ({0} == null || value == null || !{0}.Equals(value))
{{
{0} = value;
OnPropertyChanged(""{1}"");
OnPropertyChanged(nameof({1}));
}}
}}
}}", backingFieldName, memberName, (privateSetter ? "private " : string.Empty)));
Expand All @@ -578,7 +571,7 @@ internal static string GetAccessors(string memberName, string backingFieldName,
if ({0} == null || value == null || !{0}.SequenceEqual(value))
{{
{0} = value;
OnPropertyChanged(""{1}"");
OnPropertyChanged(nameof({1}));
}}
}}
}}", backingFieldName, memberName, (privateSetter ? "private " : string.Empty)));
Expand Down Expand Up @@ -1275,15 +1268,15 @@ public override CodeExpression GetDefaultValueFor(string defaultString, bool att
var rv = new CodeMethodInvokeExpression(new CodeTypeReferenceExpression(typeof(DateTime)), "Parse", new CodePrimitiveExpression(defaultString));
return rv;
}
else if (type == typeof(bool) && !string.IsNullOrWhiteSpace(defaultString))
else if (type == typeof(bool) && !string.IsNullOrWhiteSpace(defaultString))
{
if (defaultString == "0")
return new CodePrimitiveExpression(false);
if (defaultString == "0")
return new CodePrimitiveExpression(false);
else if (defaultString == "1")
return new CodePrimitiveExpression(true);
return new CodePrimitiveExpression(true);
else
return new CodePrimitiveExpression(Convert.ChangeType(defaultString, ValueType));
}
return new CodePrimitiveExpression(Convert.ChangeType(defaultString, ValueType));
}

return new CodePrimitiveExpression(Convert.ChangeType(defaultString, ValueType, CultureInfo.InvariantCulture));
}
Expand Down

0 comments on commit 59cc0ba

Please sign in to comment.