动态类型dynamic(ExpandoObject)
ExpandoObject作为ViewModel给view传值
Action
public ActionResult Index(string id) { dynamic d = new ExpandoObject(); d.id = id; d.name = "张三"; return View(d); }
View
@model dynamic <div> id=@Model.id name=@Model.name </div>
ExpandoObject转换为json
1、直接转换json,格式不是我们想要的
public ActionResult Test(string id) { dynamic d = new ExpandoObject(); d.id = id; d.name = "张三"; return Json(d, JsonRequestBehavior.AllowGet); //结果:[{"Key":"id","Value":"123"},{"Key":"name","Value":"张三"}] }
2、转换成IDictionary<string, object>,然后再转换为json就好了
public ActionResult Test(string id) { dynamic d = new ExpandoObject(); d.id = id; d.name = "张三"; var di = d as IDictionary<string, object>; di = di.ToDictionary(x => x.Key, x => x.Value); return Json(di, JsonRequestBehavior.AllowGet); }
//结果{"id":"123","name":"张三"}
3、另一种方法JSON.NET
public ActionResult Test(string id) { dynamic d = new ExpandoObject(); d.id = id; d.name = "张三"; var json = JsonConvert.SerializeObject(d); return Content(json, "application/json"); //结果正常:{"id":"123","name":"张三"}
}
扩展方法
/// <summary> /// 对象转成可以扩充的匿名对象 /// </summary> /// <param name="obj"></param> /// <returns></returns> public static dynamic ConvertToDynamic(object obj) { //知识点:ExpandoObject继承了IDictionary<String, Object>的接口 IDictionary<string, object> result = new ExpandoObject(); foreach (PropertyDescriptor pro in TypeDescriptor.GetProperties(obj.GetType())) { result.Add(pro.Name, pro.GetValue(obj)); } return result as ExpandoObject; /* //=============1、新增属性 //Product为一个class,默认只有一个属性Name Product p1 = new Product(); p1.Name = "商品名称"; dynamic result = ConvertToDynamic(p1); exProd.name1 = "我是新属性1"; exProd.name2 = "我是新属性2"; Response.Write(result.Name + "," + result.name1 + "," + result.name2); //=============2、删除属性 ((IDictionary<string, object>)result).Remove("Name2"); //=============3、枚举出已经存在的成员 foreach (var pro in (IDictionary<string, Object>)result) { Console.WriteLine(pro.Key+" "+pro.Value); } //============4、转换json var di = d as IDictionary<string, object>; di = di.ToDictionary(x => x.Key, x => x.Value); return Json(di, JsonRequestBehavior.AllowGet); */ }
//成功一定有方法,失败一定有原因。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决