dynamic参数传递问题

unclewuc 2016-10-15 04:05:35
项目资源目录


代码:
namespace Test
{
class Program
{
static void Main(string[] args)
{
var v = new
{
name = "wuc",
age = 24
};
GISCoder coder = new GISCoder();
coder.Method(v);
Console.ReadKey();
}
}
}

namespace Coder
{
public class GISCoder
{
public void Method(dynamic temp)
{
string name = temp.name;//断点 报错
string age = temp.age;
}
}
}
错误提示:


问题说明:项目中碰到的问题,简单的写了几行代码模拟了一下问题。上面的代码编译没有错误,但是运行时报错(错误提示见上图),为了没有拖慢项目的进度,我采取的是将Coder.dll的Method方法完全复制到Test项目下,发现可以运行,运行结果也对。问题是解决了,但没有想通,为什么?查了一些资料是关于var和dynamic以及匿名类的,依然没有找到可以解释的原因,求大神帮忙!!!!(备注:第一次发帖,积分不知道给多少,望见谅)
...全文
549 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
davidweil1 2017-11-29
  • 打赏
  • 举报
回复
转换成json串,再转回来就可以
unclewuc 2016-10-15
  • 打赏
  • 举报
回复
至于程序设计的问题就不用了说了,dll是别人设计的,我只是负责引用。我就是想弄明白为什么不行,拷贝一下就可以,之前想过是有可能匿名类不会能跨程序集,但是想不通的是匿名类编译之后不也是一个类吗,为什么不行
  • 打赏
  • 举报
回复
匿名类、在 Method 中根本没有可使用的动态特性,等等,我认为在这个帖子中都是一个次要的问题。 编程设计要“按照接口来设计”,这是一个基本的原则。你的设计应该基于接口,这是对于编译器非常靠谱的设计,不仅仅是避免“性能”问题,最主要是它是靠谱的。滥用动态特性是不好的。 按照接口设计,是个多么简单的原则。为什么不遵守呢?
xuzuning 2016-10-15
  • 打赏
  • 举报
回复
dynamic 不能跨解决方案
  • 打赏
  • 举报
回复
至于说你在 coder.Method(v); 代码旁边重写一个 Method 方法代码,这跟正规的模块式、工程式开发无关,就不用多考虑了。
Poopaye 2016-10-15
  • 打赏
  • 举报
回复
匿名类不能跨程序集,在Test里先定义一个类,或者使用ExpandoObject
  • 打赏
  • 举报
回复
var 是强类型的,跟弱类型无关。 dynamic 本来就是说“编译时不保证类型检验,在运行时才会在用户面前崩溃”。而且很多时候是在运行了几十遍之后、某些数据下才在用户面前丢人地崩溃!因此使用 dynamic 必须是靠谱的,你才使用,而不是胡乱使用。 如果你认为 dynamic 就是随便解析,那就错了。例如 dynamic 可以“动态”解析 ExpandoObject 类型的数据,这是因为它是靠谱的(底层动态特性是经过设计的),而不是随便的。

111,129

社区成员

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

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

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