将匿名类型转换为类

我在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" } }; 

您还可以使用reflection来映射数据(可能使用Expression来编译和缓存策略),但它可能不值得。

正如Marc所说,它可以用reflection和表达树完成……而且幸运的是, 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; }