DAL层代码:
public dynamic GetSpareInfoByCode(string spareCode)
{
var Query = (from SpareInfo in DBContext.Spare_Info where SpareInfo.SpareCode == spareCode select new { SpareInfo.SpareCode }).SingleOrDefault();
//此时调用 Query.SpareCode;正常
return Query;
}
调用代码: var entSpareInfo = bllSpareInfo.GetSpareInfoByCode(spareCode); //此时调用抛出异常
this.lblSpareCode.Text = entSpareInfo.SpareCode;
调用entSpareInfo.SpareCode;时抛出异常:“object”未包含“SpareCode”的定义
算了,还是自己声明一个实体来返回吧
如果匿名实体跟使用实体不在一个模块的话。。。是会报告这样的错误。因为匿名实体是internal的访问权限。
(嘿嘿,我也为这个郁闷过)
如果你一定要这样用,那把返回的对象使用Dynamic的一个类型封装(具体的类型忘记了,你搜查一下)。
我搜索"Dynamic 类型封装",但是没有找到我要的结果!
@黑泡泡: System.Dynamic名称空间下,System.Core这个DLL模块中。
@无之无: 我也同样遇到了这个问题,按照提示,找了System.Dynamic下的东西,觉得只有DynamicObject对象最靠谱,但是貌似不对
//这个也不对
DynamicObject entSpareInfo = bllSpareInfo.GetSpareInfoByCode(spareCode);
我找到的一个比较合理的解释就是 匿名实体默认是private类型,所以程序集A创建的,程序集B就访问不到
void Main() { dynamic x=GetSpareInfoByCode();//var 和dynamic都是运行时报错 Console.Write(x);//正常输出 //x.Dump(); //报错
object y=GetSpareInfoByCode(); Console.Write(y);//正常输出 y.Dump(); //正确 } public dynamic GetSpareInfoByCode(){ var words = from word in "The quick brown fox jumps over the lazy dog".Split() orderby word.ToUpper() select word; var duplicates = from word in words group word.ToUpper() by word.ToUpper() into g where g.Count() > 1 select new { g.Key, Count = g.Count() }; return duplicates; }
参考:http://www.cnblogs.com/serviceboy/archive/2010/04/16/1713688.html
http://hi.baidu.com/%E5%EB%B3%DF%C8%CB%C9%FA/blog/item/8d219e910cb47e84a977a487.html
http://msdn.microsoft.com/zh-cn/library/dd264736.aspx
也就是说你返回的dynamic类型必须转换成正确的类型才能使用!
开发人员可以轻松的在dynamic和非dynamic类型之间转换,正是由于dynamic类型在编译时被视为支持任何操作,所在只需要保证它们之间的转换是正确的数据类型转换,否则运行时会发生错误
坐等高手啊
=========================================
返回匿名实体 用 tolist返回 然后
void Main() { var x=GetSpareInfoByCode(); foreach (var item in (IEnumerable<object>)x) { Console.Write(item.GetType().GetProperty("Key").GetValue(item, null)); Console.Write(item.GetType().GetProperty("Count").GetValue(item, null)); } } public dynamic GetSpareInfoByCode(){ var words = from word in "The quick brown fox jumps over the lazy dog".Split() orderby word.ToUpper() select word; var duplicates = from word in words group word.ToUpper() by word.ToUpper() into g where g.Count() > 1 select new { g.Key, Count = g.Count() }; return duplicates.ToList();//重点 }
输出结果
THE
2
@黑泡泡
我需要返回的是
SingleOrDefault()
无法
ToList()