关于匿名类无法转换为object

时间:2023-03-09 07:24:53
关于匿名类无法转换为object

缘由,不能在Razor中使用匿名类,

先事先封装了一个方法,用于Razor给cshtml模板返回页面。 

 关于匿名类无法转换为object

在ashx一般处理程序中,是这样调用的

匿名类的格式如下:(只看格式,不看具体内容)

关于匿名类无法转换为object

调用这样

关于匿名类无法转换为object

报错

[TemplateCompilationException: Unable to compile template. “object”不包含“UserName”的定义,并且找不到可接受类型为“object”的第一个参数的扩展方法“UserName”(是否缺少 using 指令或程序集引用?)

关于匿名类无法转换为object

分析原因如下:

因为匿名类是internal的,razor的原理是将模板(混合html和@{c#代码})生成.net类,这样肯定就不能用internal的类,(razor的dll程序集跟匿名类肯定不在一个程序集)只能用public类。

(参考文件:

1 http://blog.csdn.net/lxy1106/article/details/50803626

2 http://blog.csdn.net/xcl13014673050/article/details/46816817

参考原理如下:

关于匿名类无法转换为object

解决方法

1.不使用匿名类,在Model中声明一个新的public类,来存储需要的字段属性。

2.使用匿名类,使用Newtonsoft.Json 9.0.1 (https://github.com/JamesNK/Newtonsoft.Json/releases/tag/9.0.1)

首先,加载newtonsoft.json.dll,然后添加引用。

然后,添加方法如下

/// <summary>
/// 将匿名类转换为public
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static dynamic ToDynamicObject(object obj)
{ string json = JsonConvert.SerializeObject(obj); //将匿名类转换为字符串 dynamic dynamicObj = JsonConvert.DeserializeObject(json);//将字符串转换为object,此时为public return dynamicObj; }

更改ashx中的代码

关于匿名类无法转换为object

但是注意!!!!这样,在cshtml拿到的model就是一个dynamic的集合,因此要用foreach遍历,不再是强类型的了,所以cshtml代码如下

关于匿名类无法转换为object

这样就能完成匿名类在razor中的调用,虽然功能能完成,但是这样并不是很好。最好还是使用第一种方法,在Model中建一个类。

追加::

对于关于匿名类无法转换为object这种情况就能执行的原因。(不也是匿名类吗?)

因为这样写没有用到dynamic去读取属性的值,而是模板使用反射读取的,反射是可以读取internal成员的,但是一旦放到集合中或者有关联属性的时候,就用到dynamic了,而dyanmic是无法访问internal的

下面是在reflector中ParseRazor方法

关于匿名类无法转换为object