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 })); }