internal static CommandExecutorBuilder TryCreate(CommandMapper mapper, ConverterAgent agent)
        {
            var builder = new CommandExecutorBuilder(mapper.CommandSource.SourceType);
            var dict = new Dictionary<string, bool>();
            switch (mapper.CommandSource.SourceType)
            {
                case CommandSourceType.Class:
                    var mappers = new List<PropertyParameterMapper>();
                    foreach (var property in mapper.CommandSource.ClassType.GetProperties())
                    {
                        if (property.GetCustomAttribute<PropertyParameterAttribute>() != null)
                        {
                            if (!property.CanWrite)
                            {
                                Debug.WriteLine("parameter alway should can write!");
                                if (Debugger.IsAttached) Debugger.Break();
                                return null;
                            }

                            if (!agent.CanConvert(property.PropertyType))
                            {
                                Debug.WriteLine($"parameter type [{property.PropertyType.Name}] missing converter.");
                                if (Debugger.IsAttached) Debugger.Break();
                                return null;
                            }

                            var setter = new Action<object, object>(property.SetValue);
                            var parameterMapper = new PropertyParameterMapper(property, property.PropertyType, setter);
                            if (!parameterMapper.TryMap()) return null;

                            foreach (var parameterName in parameterMapper.GetNames())
                            {
                                if (dict.ContainsKey(parameterName))
                                {
                                    Debug.WriteLine($"parameter name {parameterName} was exists");
                                    if (Debugger.IsAttached) Debugger.Break();
                                    return null;
                                }
                                else
                                {
                                    dict.Add(parameterName, false);
                                }
                            }
                            mappers.Add(parameterMapper);
                        }
                    }
                    mappers.Sort((x, y) =>
                        x.AttributeMapper.NameAttribute.Order.CompareTo(
                        y.AttributeMapper.NameAttribute.Order));
                    builder.parameterMappers.AddRange(mappers);
                    break;

                case CommandSourceType.Method:
                    var method = ((MethodCommandSource)mapper.CommandSource).Method;
                    foreach (var parameter in method.GetParameters())
                    {
                        if (!JasilyConsoleEngine.IsDefaultParameters(parameter.ParameterType) &&
                                !agent.CanConvert(parameter.ParameterType))
                        {
                            Debug.WriteLine($"parameter type [{parameter.ParameterType.Name}] missing converter.");
                            if (Debugger.IsAttached) Debugger.Break();
                            return null;
                        }

                        var parameterMapper = new MethodParameterMapper(parameter);
                        if (!parameterMapper.TryMap()) return null;

                        foreach (var parameterName in parameterMapper.GetNames())
                        {
                            if (dict.ContainsKey(parameterName))
                            {
                                Debug.WriteLine($"parameter name {parameterName} was exists");
                                if (Debugger.IsAttached) Debugger.Break();
                                return null;
                            }
                            else
                            {
                                dict.Add(parameterName, false);
                            }
                        }

                        builder.methodParameterSetter = (obj, args) => method.Invoke(obj, args);
                        builder.parameterMappers.Add(parameterMapper);
                    }
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
            }

            return builder;
        }
 public abstract OperationResult SetCommandLine(CommandLine commandLine,
     ICommandParameterParser parameterParser, ConverterAgent converters);