WCF返回匿名类型(整理自网络以总结备忘)

  在WCF的服务端,通常会有很多函数需要返回匿名类型的集合。
  之前一直在winform或web的类中返回object[]或是List<object>是OK的,但是在wcf里返回的时候会报错。
  试了几种方法,最终通过返回DataTable的方法解决了。
  首先,写个扩展方法用来转换IEnumberable类型的数据为DataTable。

public static DataTable ConvertToDataTable<T>(this IEnumerable<T> array)
{
var ret
= new DataTable();
ret.TableName
= typeof(T).Name.Replace(".", "_");//必须要设置该属性,否则会报错,同webservice返回datatable一样
foreach (PropertyDescriptor dp in TypeDescriptor.GetProperties(typeof(T)))
{
//此处可以添加逻辑将nullable类型单独处理
ret.Columns.Add(dp.Name, dp.PropertyType);
}
foreach (T item in array)
{
var Row
= ret.NewRow();
foreach (PropertyDescriptor dp in TypeDescriptor.GetProperties(typeof(T)))
Row[dp.Name]
= dp.GetValue(item);
ret.Rows.Add(Row);
}
return ret;
}


  其次,在服务端,查询出匿名类型后,调用上面的方法来进行转换,如下

public DataTable GetClassInfo()
{
try
{
using (MyDbcontext entities = new MyDbcontext())
{
DataTable dt
= (from c in entities.V_bookdefault
orderby c.bookupdatetime descending
select
new { c.bookid, c.bookname, c.bookimagepath }).ToList().ConvertToDataTable();

return dt;
}
}
catch (Exception ex)
{
//do sth
}
}

  对于匿名类型中nullable属性情况,可以用两种方式解决:

    一、在ConvertToDataTable方法中将每种nullable特殊处理

      二、在匿名对象中将如DateTime? int? ,等类型转化
总结自:http://hi.baidu.com/kanbafang/blog/item/3e708214f8803c04c83d6da1.html

posted @ 2011-06-03 16:14  半边书生9527  阅读(890)  评论(0编辑  收藏  举报