public void Initialize <TModel>(IModelBindingDefinition <TModel> init)
        {
            var modelAttribute            = typeof(TModel).GetCustomAttributes(true).OfType <ArgsModelAttribute>().SingleOrDefault() ?? ArgsModelAttribute.Default;
            var modelDescriptionAttribute = typeof(TModel).GetCustomAttributes(true).OfType <DescriptionAttribute>().SingleOrDefault();

            init.SwitchDelimiter = modelAttribute.SwitchDelimiter;
            init.StringComparer  = modelAttribute.StringComparer;
            SortedDictionary <int, MemberInfo> ordinalArguments = new SortedDictionary <int, MemberInfo>();

            if (modelDescriptionAttribute != null)
            {
                init.CommandModelDescription = modelDescriptionAttribute.Description;
            }

            var members = GetMembers(typeof(TModel));

            foreach (MemberInfo member in members)
            {
                var memberBinding = init.GetOrCreateMemberBindingDefinition(member);

                var memberAttributes = member.GetCustomAttributes(true).ToArray();

                var switchAttribute = memberAttributes.OfType <ArgsMemberSwitchAttribute>().SingleOrDefault();
                if (switchAttribute != null)
                {
                    if (switchAttribute.SwitchValues != null)
                    {
                        memberBinding.SwitchValues.AddRange(switchAttribute.SwitchValues);
                    }
                    if (switchAttribute.ArgumentIndex.HasValue)
                    {
                        ordinalArguments.Add(switchAttribute.ArgumentIndex.Value, member);
                    }
                }
                else
                {
                    memberBinding.SwitchValues.AddRange(new[] { member.Name, DeriveShortName(members, member) }.Distinct(init.StringComparer));
                }

                var defaultValueAttribute = memberAttributes.OfType <DefaultValueAttribute>().SingleOrDefault();
                if (defaultValueAttribute != null)
                {
                    memberBinding.DefaultValue = defaultValueAttribute.Value;
                }

                var typeConverterAttribute = memberAttributes.OfType <TypeConverterAttribute>().SingleOrDefault();

                if (typeConverterAttribute != null)
                {
                    memberBinding.TypeConverter = (TypeConverter)ArgsTypeResolver.Current.GetService(Type.GetType(typeConverterAttribute.ConverterTypeName));
                }
            }

            init.SetOrdinalArguments(ordinalArguments.Select(a => a.Value));
        }
예제 #2
0
 public FluentModelBindingConfiguration <TModel> HasFirstOrdinalArgumentOf <TResult>(Expression <Func <TModel, TResult> > member)
 {
     Source.SetOrdinalArguments(new[] { member.GetMemberInfoFromExpression() });
     return(this);
 }