private void AddConstructorForWatchedList(CodeTypeDeclaration typeDeclaration, CodeMemberField memberField, string listPropertyName) { CodeConstructor constructor = typeDeclaration.FindEmptyConstructor(); var field = new CodeFieldReferenceExpression(null, memberField.Name); CodeTypeReference innerListType = GetConcreteListType(memberField.Type.TypeArguments[0].BaseType); CodeObjectCreateExpression innerList = new CodeObjectCreateExpression(innerListType); CodeObjectCreateExpression outerList = new CodeObjectCreateExpression(memberField.Type, innerList); CodeAssignStatement assignment = new CodeAssignStatement(field, outerList); constructor.Statements.Add(assignment); var itemAddedCode = new CodeMethodReferenceExpression(null, listPropertyName + "ItemAdded"); constructor.Statements.Add(new CodeAttachEventStatement(field, "ItemAdded", itemAddedCode)); var itemRemovedCode = new CodeMethodReferenceExpression(null, listPropertyName + "ItemRemoved"); constructor.Statements.Add(new CodeAttachEventStatement(field, "ItemRemoved", itemRemovedCode)); }