private void SetupValue(IAction action, IMvcContext context) { var paramname = Name; if (TargetType.IsAbstract) { return; } if (TargetType == typeof(XElement)) { var val = context.GetXml(Name); SetDirectly(action, val); } else if (TargetType.IsArray) { object val; var arr = context.GetObject(paramname); if (arr is Array) { var resultArray = ((IEnumerable)arr).OfType <object>().Select(_ => _.ToTargetType(TargetType.GetElementType())).ToArray(); var t = Array.CreateInstance(TargetType.GetElementType(), resultArray.Length); Array.Copy(resultArray, t, resultArray.Length); val = t; } else { if (_bindattribute.Split) { var str = context.Get(paramname); var a = str.SmartSplit().Select(_ => _.ToTargetType(TargetType.GetElementType())).ToArray(); var t = Array.CreateInstance(TargetType.GetElementType(), a.Length); Array.Copy(a, t, a.Length); val = t; } else { val = context.GetArray(TargetType.GetElementType(), paramname); } } SetDirectly(action, val); } else if (typeof(IDictionary <string, string>) == TargetType) { var current = (IDictionary <string, string>)GetCurrent(action); if (null == current) { current = new Dictionary <string, string>(); SetDirectly(action, current); } IDictionary <string, string> val; if (IsComplexString) { var str = context.Get(paramname); val = ComplexStringExtension.Parse(str); } else { val = context.GetDict(paramname); } foreach (var p in val) { current[p.Key] = p.Value; } } else { object val = context.Get(paramname); if (((string)val).IsEmpty()) { val = _bindattribute.Default; } var customBindConverter = _bindattribute as ICustomBindConverter; if (customBindConverter != null) { customBindConverter.SetConverted(action, (string)val, context, SetDirectly); return; } SetConverted(action, val, context); } }