ASP.NET MVC3 + Entity Framework项目中,从控制器传递匿名对象到视图非常常见,原本以为用dynamic能轻松搞定,最后发现我错了:
Controller:
代码如下 |
复制代码 |
public ActionResult Index() { testContext context = new testContext(); dynamic data = context.People .Join(context.Pets, person => person.Id, Pet => Pet.Pid, (person, pet) => new { Person = person.Name, Pet = pet.Name }); return View(data); }
View:
@model dynamic
@foreach(var item in Model) { @(item.Person)<text>,</text>@(item.Pet)<br /> }
|

其原因是C#的编译器总是将匿名类型编译成internal的,当通过dynamic访问在当前上下文不可见的成员的时候,就会引发异常。问题重现:
代码如下 |
复制代码 |
using System; using System.Collections.Generic; using System.Linq;
namespace Controller { public class Test { /// <summary> /// 模拟匿名对象匿名类 /// </summary> private class Anonymous { public string Person { get; set; } public string Pet { get; set; } }
public dynamic GetValue() { return new Anonymous(); } } }
namespace View { using Controller;
class Program { static void Main(string[] args) { dynamic anonymous = new Test().GetValue(); Console.WriteLine(anonymous.Person);
Console.ReadKey(); } } }
|
以前都用老赵的ToDynamic方法解决,今天在.NET 4.0的System命名空间下看到一个类Tuple,了解后发现用它也可以解决上边的问题:
Controller:
代码如下 |
复制代码 |
public ActionResult Index() { testContext context = new testContext(); dynamic data = context.People .Join(context.Pets, person => person.Id, Pet => Pet.Pid, (person, pet) => new { Person = person.Name, Pet = pet.Name }) .ToList().Select(item => Tuple.Create(item.Person, item.Pet)); return View(data); }
View:
@model IEnumerable<Tuple<string, string>>
@foreach(var item in Model) { @(item.Item1)<text>,</text>@(item.Item2)<br /> }
|
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!