public string Expand()
        {
            var parameters = _member.Parameters.GetParametersFromExpressions(_expressionFactory, _options);
            var returnType = _typescriptTypeMapper.GetTypeOutput(_member.ReturnType);
            var statements = _member.Statements.GetStatementsFromCollection(_statementFactory, _options);


            var typeParameters = _member.TypeParameters.OfType <CodeTypeParameter>()
                                 .Select(parameter => _typescriptTypeParameter.Evaluate(parameter))
                                 .ToList();
            var typeParametersExpression = string.Empty;

            if (typeParameters.Any())
            {
                typeParametersExpression = $"<{string.Join(",", typeParameters)}>";
            }

            var shouldGenerateMethodBody     = (bool)_member.UserData["GenerateMethodBody"];
            var shouldGenerateAccessModifier = (bool)_member.UserData["GenerateAccessModifier"];

            var accessModifier = shouldGenerateAccessModifier ?
                                 _member.GetAccessModifier()
                : string.Empty;

            return(shouldGenerateMethodBody
                ? $"{_options.IndentString}{accessModifier}{_member.Name.ConvertPascalCaseToCamelCase()}{typeParametersExpression}({parameters}): {returnType}{{{Environment.NewLine}{statements}{Environment.NewLine}{_options.IndentString}{_options.IndentString}}}"
                : $"{_options.IndentString}{accessModifier}{_member.Name.ConvertPascalCaseToCamelCase()}{typeParametersExpression}({parameters}): {returnType};");
        }
        public string Expand()
        {
            var accessModifier = (bool)_typeDeclaration.UserData["AddExportKeyword"] ? GetAccessModifier(_typeDeclaration.TypeAttributes) : string.Empty;
            var name           = _typeDeclaration.Name;
            var typeType       = GetTypeOfType(_typeDeclaration);

            var codeTypeMembers = _typeDeclaration.Members
                                  .OfType <CodeTypeMember>()
                                  .ToList();

            var onlyOneConstructor = codeTypeMembers
                                     .Where(member => member is CodeConstructor)
                                     .Take(1);

            var members = codeTypeMembers
                          .Where(member => IsSupportedType(member) && !(member is CodeConstructor))
                          .Union(onlyOneConstructor)
                          .Select(member =>
            {
                member.UserData["HasBaseConstructorCall"] = _typeDeclaration.BaseTypes.Count > 0;
                member.UserData["GenerateFieldType"]      = !_typeDeclaration.IsEnum;
                member.UserData["GenerateAccessModifier"] = !_typeDeclaration.IsInterface;
                member.UserData["GenerateMethodBody"]     = !_typeDeclaration.IsInterface;
                member.UserData["GeneratePropertyBody"]   = !_typeDeclaration.IsInterface;
                return(_options.IndentString + _memberFactory.GetMember(member, _options).Expand());
            })
                          .ToList();

            var membersExpression = string.Empty;

            if (members.Any())
            {
                membersExpression = string.Join(Environment.NewLine, members.Where(member => !string.IsNullOrWhiteSpace(member)));
            }

            var typeParameters = _typeDeclaration.TypeParameters.OfType <CodeTypeParameter>()
                                 .Select(parameter => _typescriptTypeParameter.Evaluate(parameter))
                                 .ToList();
            var typeParametersExpression = string.Empty;

            if (typeParameters.Any())
            {
                typeParametersExpression = $"<{string.Join(",", typeParameters)}>";
            }

            var baseTypes = _typeDeclaration.BaseTypes
                            .OfType <CodeTypeReference>()
                            .Where(reference => _typescriptTypeMapper.IsValidTypeForDerivation(reference))
                            .Select(reference => _typescriptTypeMapper.GetTypeOutput(reference))
                            .ToList();
            var baseTypesExpression = string.Empty;

            if (baseTypes.Any() && !_typeDeclaration.IsEnum)
            {
                baseTypesExpression = $" extends {string.Join(",", baseTypes)}";
            }

            return(_options.IndentString + $"{accessModifier}{typeType} {name}{typeParametersExpression}{baseTypesExpression}{{{Environment.NewLine}{membersExpression}{Environment.NewLine}{_options.IndentString}}}");
        }