我在List anBook中有一个匿名类型:
var anBook=new []{ new {Code=10, Book ="Harry Potter"}, new {Code=11, Book="James Bond"} };
是否可以将其转换为具有以下clearBook定义的List:
public class ClearBook { int Code; string Book; }
通过使用直接转换,即不通过书籍循环?
好吧,你可以使用:
var list = anBook.Select(x => new ClearBook { Code = x.Code, Book = x.Book}).ToList();
但不,没有直接转换支持.显然你需要添加访问器等(不要公开字段) - 我猜:
public int Code { get; set; } public string Book { get; set; }
当然,另一种选择是从数据开始,如何:
var list = new List{ new ClearBook { Code=10, Book="Harry Potter" }, new ClearBook { Code=11, Book="James Bond" } };
您还可以使用反射来映射数据(可能使用Expression
编译和缓存策略),但它可能不值得.
正如Marc所说,它可以用反射和表达树完成......而且幸运的是,MiscUtil中有一个类就是这样.但是,更仔细地查看您的问题听起来您希望将此转换应用于集合(数组,列表或其他)而不进行循环.那不可能奏效.您正在从一种类型转换为另一种类型 - 它不像您可以使用对匿名类型的引用,就好像它是对ClearBook的引用一样.
要举例说明PropertyCopy类是如何工作的,您只需要:
var books = anBook.Select(book => PropertyCopy.CopyFrom(book)) .ToList();
这些扩展怎么样?简单地在你的匿名类型上调用.ToNonAnonymousList ..
public static object ToNonAnonymousList(this List list, Type t) { //define system Type representing List of objects of T type: Type genericType = typeof (List<>).MakeGenericType(t); //create an object instance of defined type: object l = Activator.CreateInstance(genericType); //get method Add from from the list: MethodInfo addMethod = l.GetType().GetMethod("Add"); //loop through the calling list: foreach (T item in list) { //convert each object of the list into T object by calling extension ToType () //Add this object to newly created list: addMethod.Invoke(l, new[] {item.ToType(t)}); } //return List of T objects: return l; } public static object ToType (this object obj, T type) { //create instance of T type object: object tmp = Activator.CreateInstance(Type.GetType(type.ToString())); //loop through the properties of the object you want to covert: foreach (PropertyInfo pi in obj.GetType().GetProperties()) { try { //get the value of property and try to assign it to the property of T type object: tmp.GetType().GetProperty(pi.Name).SetValue(tmp, pi.GetValue(obj, null), null); } catch (Exception ex) { Logging.Log.Error(ex); } } //return the T type object: return tmp; }