private static IMethodSymbol FindSetPropertyMethod(this INamedTypeSymbol classSymbol, CommonCompilation compilation) { // Find SetProperty<T>(ref T, T, string) method. var setPropertyMethod = classSymbol .GetMembers("SetProperty") .OfType <IMethodSymbol>() .FirstOrDefault(m => m.Parameters.Count == 3 && m.TypeParameters.Count == 1); if (setPropertyMethod != null) { var parameters = setPropertyMethod.Parameters; var typeParameter = setPropertyMethod.TypeParameters[0]; var stringType = compilation.GetSpecialType(SpecialType.System_String); if (setPropertyMethod.ReturnsVoid && parameters[0].RefKind == RefKind.Ref && parameters[0].Type.Equals(typeParameter) && parameters[1].Type.Equals(typeParameter) && parameters[2].Type.Equals(stringType)) { return(setPropertyMethod); } } return(null); }
internal static IMethodSymbol GenerateSetPropertyMethod(CommonCompilation compilation) { var body = Syntax.ParseStatement( @"if (!System.Collections.Generic.EqualityComparer<T>.Default.Equals(field, value)) { field = value; var handler = PropertyChanged; if (handler != null) { handler(this, new System.ComponentModel.PropertyChangedEventArgs(name)); } }"); body = body.WithAdditionalAnnotations(CodeAnnotations.Simplify); var stringType = compilation.GetSpecialType(SpecialType.System_String); var voidType = compilation.GetSpecialType(SpecialType.System_Void); var typeParameter = SymbolFactory.CreateTypeParameter("T"); var parameter1 = SymbolFactory.CreateParameter( attributes: null, refKind: RefKind.Ref, isParams: false, type: typeParameter, name: "field"); var parameter2 = SymbolFactory.CreateParameter(typeParameter, "value"); var parameter3 = SymbolFactory.CreateParameter(stringType, "name"); return(SymbolFactory.CreateMethod( attributes: null, accessibility: CommonAccessibility.Private, modifiers: new SymbolModifiers(), returnType: voidType, explicitInterfaceSymbolOpt: null, name: "SetProperty", typeParameters: new[] { typeParameter }, parameters: new[] { parameter1, parameter2, parameter3 }, statements: new[] { body })); }
internal static IMethodSymbol GenerateSetPropertyMethod(CommonCompilation compilation) { var body = Syntax.ParseStatement( @"if (!System.Collections.Generic.EqualityComparer<T>.Default.Equals(field, value)) { field = value; var handler = PropertyChanged; if (handler != null) { handler(this, new System.ComponentModel.PropertyChangedEventArgs(name)); } }"); body = body.WithAdditionalAnnotations(CodeAnnotations.Simplify); var stringType = compilation.GetSpecialType(SpecialType.System_String); var voidType = compilation.GetSpecialType(SpecialType.System_Void); var typeParameter = SymbolFactory.CreateTypeParameter("T"); var parameter1 = SymbolFactory.CreateParameter( attributes: null, refKind: RefKind.Ref, isParams: false, type: typeParameter, name: "field"); var parameter2 = SymbolFactory.CreateParameter(typeParameter, "value"); var parameter3 = SymbolFactory.CreateParameter(stringType, "name"); return SymbolFactory.CreateMethod( attributes: null, accessibility: CommonAccessibility.Private, modifiers: new SymbolModifiers(), returnType: voidType, explicitInterfaceSymbolOpt: null, name: "SetProperty", typeParameters: new[] { typeParameter }, parameters: new[] { parameter1, parameter2, parameter3 }, statements: new[] { body }); }
private static IMethodSymbol FindSetPropertyMethod(this INamedTypeSymbol classSymbol, CommonCompilation compilation) { // Find SetProperty<T>(ref T, T, string) method. var setPropertyMethod = classSymbol .GetMembers("SetProperty") .OfType<IMethodSymbol>() .FirstOrDefault(m => m.Parameters.Count == 3 && m.TypeParameters.Count == 1); if (setPropertyMethod != null) { var parameters = setPropertyMethod.Parameters; var typeParameter = setPropertyMethod.TypeParameters[0]; var stringType = compilation.GetSpecialType(SpecialType.System_String); if (setPropertyMethod.ReturnsVoid && parameters[0].RefKind == RefKind.Ref && parameters[0].Type.Equals(typeParameter) && parameters[1].Type.Equals(typeParameter) && parameters[2].Type.Equals(stringType)) { return setPropertyMethod; } } return null; }