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