private bool TryGetParamterValue(ActivatorParameterDescriptor context) { var entries = DictionaryExtension.ToDictionary((IEnumerable)context.Argument); foreach (var entry in entries) { //判断当前参数名是否与字典条目的键相同 var found = string.Equals(entry.Key?.ToString(), context.ParameterName, StringComparison.OrdinalIgnoreCase); if (found) { object value; if (Convert.TryConvertValue(entry.Value, context.ParameterType, out value)) { context.ParameterValue = value; return(true); } else { return(false); } } } return(false); }
private void SetProperties(object target, IEnumerable source) { if (target == null || source == null) { return; } if (target.GetType().IsDictionary()) { var entries = DictionaryExtension.ToDictionary(source); } }
public object Create(Type type, object argument, Func <ActivatorParameterDescriptor, bool> binder = null) { object result = null; if (type.IsArray) { var elementType = type.GetElementType(); if (argument != null && argument is IEnumerable && result is IList) { var list = (IList)System.Activator.CreateInstance(typeof(List <>).MakeGenericType(elementType)); foreach (var entry in (IEnumerable)argument) { list.Add(Convert.ConvertValue(entry, elementType)); } result = Array.CreateInstance(elementType, list.Count); for (int i = 0; i < list.Count; i++) { ((Array)result).SetValue(list[i], i); } return(result); } return(Array.CreateInstance(elementType, 0)); } if (TypeExtension.IsAssignableFrom(typeof(IDictionary <,>), type)) { var types = type.GetGenericArguments(); if (type.IsInterface) { result = System.Activator.CreateInstance(typeof(Dictionary <,>).MakeGenericType(types)); } else { result = System.Activator.CreateInstance(type); } if (argument != null && result is IDictionary) { var entries = DictionaryExtension.ToDictionary((IEnumerable)argument); foreach (var entry in entries) { ((IDictionary)result).Add( Convert.ConvertValue(entry.Key, types[0]), Convert.ConvertValue(entry.Value, types[1])); } } } if (typeof(IDictionary).IsAssignableFrom(type)) { if (type.IsInterface) { result = System.Activator.CreateInstance <Dictionary <object, object> >(); } else { result = System.Activator.CreateInstance(type); } if (argument != null && result is IDictionary) { var entries = DictionaryExtension.ToDictionary((IEnumerable)argument); foreach (var entry in entries) { ((IDictionary)result).Add(entry.Key, entry.Value); } } } if (TypeExtension.IsAssignableFrom(typeof(ICollection <>), type)) { var types = type.GetGenericArguments(); if (type.IsInterface) { result = System.Activator.CreateInstance(typeof(List <>).MakeGenericType(types)); } else { result = System.Activator.CreateInstance(type); } if (argument != null && argument is IEnumerable && result is IList) { foreach (var entry in (IEnumerable)argument) { ((IList)result).Add(Convert.ConvertValue(entry, types[0])); } } } if (typeof(IList).IsAssignableFrom(type)) { if (type.IsInterface) { result = System.Activator.CreateInstance <List <object> >(); } else { result = System.Activator.CreateInstance(type); } if (argument != null && argument is IEnumerable) { foreach (var entry in (IEnumerable)argument) { ((IList)result).Add(entry); } } } if (typeof(ICollection).IsAssignableFrom(type)) { if (type.IsInterface) { result = System.Activator.CreateInstance <List <object> >(); } else { result = System.Activator.CreateInstance(type); } } return(result); }