dynamic跨程序集访问的问题..

l2999019 2015-07-02 11:32:15
我在BLL层返回了一个dynamic的数据...

然后在UI层接收..并访问其中的属性..最终报错

"Unhandled Exception: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'object' does not contain a definition for 'Value'"

经查询发现这是因为C#的编译器总是会将匿名类型编译成internal的类型

改用用友元的方式...
在UI的命名空间上加入
[assembly: InternalsVisibleTo("XXXX.BLL")]

访问还是失败..

测试用反射的方式则可以获取其中的值... - - 不过不怎么想用反射...

BLL层的代码如下:

namespace XXX.BLL.stop
{
public dynamic SelectByID(int id)
{
var itme = from a in EF数据源
join b in EF数据源 on a.goodid equals b.id
join c in EF数据源 on b.order_id equals c.id
where a.id==id
select new
{
a.id,
a.XXX,
a.XXXXX,
a.XXXXXXX,
a.XXX,
a.XX,
a.X,
a.XXXXXX,
b.JJJJ,
c.FFFFF
};
return itme.FirstOrDefault<dynamic>();
}
}


求大神给个解决方案...
...全文
390 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
l2999019 2015-07-03
  • 打赏
  • 举报
回复
引用 5 楼 moonwrite 的回复:
从封装的角度来说~ 返回的是强类型的实体类才好~ 不然调用者必须去方法内查看 才知道返回的具体是什么 如果你真的不想,可以返回IQueryAble
返回IQueryAble之后 我怎么读取里面的数据呢?
l2999019 2015-07-03
  • 打赏
  • 举报
回复
引用 5 楼 moonwrite 的回复:
从封装的角度来说~ 返回的是强类型的实体类才好~ 不然调用者必须去方法内查看 才知道返回的具体是什么 如果你真的不想,可以返回IQueryAble
因为是多表连接的..还要创建无数个辅助类 - -,实在不想做这种操作... 而且前台大部分主要是返回JSON 然后JS去解析的.....就这页面..非要用webform.. - -,就闹眼子了..
l2999019 2015-07-03
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
另外在,在使用你的“UI层”中,一般来说,不要去画蛇添足地额外设计什么“通用层次”。UI层根据BLL层数据协议,它就知道直接读取所收到的数据的
a.id;
a.JJJJ;
a.FFFFF;
了,千万不要在相像出什么“万能的反射层”。使用dynamic本来就是让你直截了当地读取dynamic数据了,它完成了中间操作,你就不要再自己发明一个中间转换层了。 我以前贴过一个“跨进程”的使用dynamic来读取数据的过程,虽然那是silverlight中的,但是好在微软的东西都是通用的,可以看到那里直接使用从网络接收到的数据,而不需要在dynamic之上来自己来个什么dynamic反射。。
谢谢.. - - 我也不想用反射的..是调试的时候看到有数据..才想到可以试试..试了 成功了....我来问的目的就是不想用您说的万能反射..
moonwrite 2015-07-03
  • 打赏
  • 举报
回复
public IQueryAble SelectByID(int id) { var itme = from a in EF数据源 join b in EF数据源 on a.goodid equals b.id join c in EF数据源 on b.order_id equals c.id where a.id==id select new { a.id, a.XXX, a.XXXXX, a.XXXXXXX, a.XXX, a.XX, a.X, a.XXXXXX, b.JJJJ, c.FFFFF } return time//还没有进行正式数据库的查询 } 大概如此 var v = SelectByID(int id).FirstOrDefualt()//进行正式的数据库查询 我还是建议自己定义实体类 最后想到 你为什么不返回object呢~ 只要json的类库能够正确解析就可以了
  • 打赏
  • 举报
回复
那个帖子的地址:http://bbs.csdn.net/topics/390006799 可以参考一下客户端的代码。
  • 打赏
  • 举报
回复
另外在,在使用你的“UI层”中,一般来说,不要去画蛇添足地额外设计什么“通用层次”。UI层根据BLL层数据协议,它就知道直接读取所收到的数据的
a.id;
a.JJJJ;
a.FFFFF;
了,千万不要在相像出什么“万能的反射层”。使用dynamic本来就是让你直截了当地读取dynamic数据了,它完成了中间操作,你就不要再自己发明一个中间转换层了。 我以前贴过一个“跨进程”的使用dynamic来读取数据的过程,虽然那是silverlight中的,但是好在微软的东西都是通用的,可以看到那里直接使用从网络接收到的数据,而不需要在dynamic之上来自己来个什么dynamic反射。。
  • 打赏
  • 举报
回复
输出的对象应该使用 ExpandoObject 类型,它支持 dynamic关键字声明方式。 例如
var a = new ExpandoObject();    //创建对象实例
dynamic b = a;                  //使用dynamic声明
b.f1 = "a";                     //添加自定义属性
b.f2 = 123;
b.c = DateTime.Now;
var c = (IDictionary<string, object>)a;     //使用可枚举的接口
foreach (var x in a)
    Console.WriteLine("{0}->{1}", x.Key, x.Value);
l2999019 2015-07-02
  • 打赏
  • 举报
回复
没有人么???.
moonwrite 2015-07-02
  • 打赏
  • 举报
回复
从封装的角度来说~ 返回的是强类型的实体类才好~ 不然调用者必须去方法内查看 才知道返回的具体是什么 如果你真的不想,可以返回IQueryAble

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧