private static object execute(object obj, MethodInfo mi, NameValueCollection nv) { object ret; ParameterInfo[] paras = mi.GetParameters(); if (paras.Length == 1 && paras[0].ParameterType == typeof(NameValueCollection)) { ret = mi.Invoke(obj, new object[] { nv }); } else if (paras.Length == 0) { ret = mi.Invoke(obj, null); } else { List <object> p = new List <object>(); foreach (var item in paras) { if (item.ParameterType.IsSubclassOf(typeof(Array))) { string v = nv[item.Name] ?? nv[item.Name + "[]"]; string[] strs = StringUtil.CommaDelimitedListToStringArray(v); Array array = Array.CreateInstance(item.ParameterType.GetElementType(), strs.Length); for (int i = 0; i < strs.Length; i++) { array.SetValue(TypeConvertUtil.ConvertTo(strs[i], item.ParameterType.GetElementType()), i); } p.Add(array); } else if (item.ParameterType == typeof(MobileDetect)) { p.Add(MobileDetect.Instance); } else { string v = nv[item.Name]; p.Add(TypeConvertUtil.ConvertTo(v, item.ParameterType)); } } ret = mi.Invoke(obj, p.ToArray()); } return(ret); }
public static List <T> ImportFromXml(XmlDocument xml) { Type t = typeof(T); List <PropertyInfo> props = new List <PropertyInfo>(t.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly)); List <T> list = new List <T>(); XmlNode node = xml.DocumentElement.SelectSingleNode("//" + t.FullName); if (node == null) { return(list); } foreach (XmlNode n in node.ChildNodes) { T obj = Activator.CreateInstance <T>(); foreach (XmlAttribute attr in n.Attributes) { PropertyInfo pi = props.Find(p => { return(p.Name.Equals(attr.Name, StringComparison.InvariantCultureIgnoreCase)); }); if (pi == null || !pi.CanWrite) { continue; } pi.SetValue(obj, TypeConvertUtil.ConvertTo(attr.Value, pi.PropertyType), null); } list.Add(obj); } ILinqContext <T> context = CreateContext(); // remove old items // List <t> ids = new List <t>(); foreach (var item in list) { ids.Add(item.Id); } List <T> old_list = Gets(context, StringUtil.CollectionToCommaDelimitedString(ids)); foreach (var item in old_list) { if (list.Find((T obj) => { return(item.Id.Equals(obj.Id)); }) != null) { context.Remove(item); } } // add new items // foreach (var item in list) { context.Add(item, true); } context.SubmitChanges(true); return(list); }