自定义一个dynamichelper类,主要是实现dynamic对象与xml之间的互换操作。
toxml(dynamic dynamicobject)将传入的dynamicobject转换为xml。
toobject(string xml, dynamic dynamicresult) 将传入的string,先转换成xelement元素,然后再构建一个dynamicxelement对象,返回结果。
toobject(string xml)直接将xml转换为dynamicxelement对象。
2 {
3 public static string toxml(dynamic dynamicobject)
4 {
5 dynamicxelement xmlnode = dynamicobject;
6 return xmlnode.xcontent.tostring();
7 }
8
9 public static dynamic toobject(string xml, dynamic dynamicresult)
10 {
11 xelement element = xelement.parse(xml);
12 dynamicresult = new dynamicxelement(element);
13 return dynamicresult;
14 }
15
16 public static dynamic toobject(string xml)
17 {
18 xelement element = xelement.parse(xml);
19 dynamic dynamicresult = new dynamicxelement(element);
20 return dynamicresult;
21 }
22 }
为了实现toxml()方法,修改dynamicxelement类,将私有变量node设置为属性xcontent(并且设置set 方法为私有的)。这里,主要是为了获取xelement的所有内容而改进的。设置后的dynamicxelement类如下:
dynamicxelement 代码 1 public class dynamicxelement : dynamicobject2 {
3 public dynamicxelement(xelement node)
4 {
5 this.xcontent = node;
6 }
7
8 public dynamicxelement()
9 {
10 }
11
12 public dynamicxelement(string name)
13 {
14 this.xcontent = new xelement(name);
15 }
16
17 public xelement xcontent
18 {
19 get;
20 private set;
21 }
22
23 public override bool trysetmember(
24 setmemberbinder binder, object value)
25 {
26 xelement setnode = this.xcontent.element(binder.name);
27 if (setnode != null)
28 setnode.setvalue(value);
29 else
30 {
31 //creates an xelement without a value.
32 if (value.gettype() == typeof(dynamicxelement))
33 this.xcontent.add(new xelement(binder.name));
34 else
35 this.xcontent.add(new xelement(binder.name, value));
36 }
37 return true;
38 }
39
40 public override bool trygetmember(
41 getmemberbinder binder, out object result)
42 {
43 xelement getnode = this.xcontent.element(binder.name);
44 if (getnode != null)
45 {
46 result = new dynamicxelement(getnode);
47 }
48 else
49 {
50 result = new dynamicxelement(binder.name);
51 }
52 return true;
53 }
54
55 public override bool tryconvert(
56 convertbinder binder, out object result)
57 {
58 if (binder.type == typeof(string))
59 {
60 result = this.xcontent.value;
61 return true;
62 }
63 else
64 {
65 result = null;
66 return false;
67 }
68 }
69 }
其他的都设置好了以后,rundynamichelper()将验证以上的方法,对dynamichelper中所有的方法进行相应的测试。
1 private static void rundynamichelper()2 {
3 //构造一个dynamic对象
4 dynamic dynamicobject = new dynamicxelement("importsample");
5
6 //设置xml
7 string xml = resources.importsample;
8
9 //转换成为dynamic实体(赋值) toobject()
10 dynamic dynamicresult = dynamichelper.toobject(xml, dynamicobject);
11
12 string message = dynamicresult.import.message;
13 console.writeline(message);
14 console.writeline();
15
16 //转换成为dynamic实体(赋值) toobject()
17 dynamic dynamicresult2 = dynamichelper.toobject(xml);
18
19 message = dynamicresult2.import.message;
20 console.writeline(message);
21 console.writeline();
22 //toxml()
23 string xmlresult = dynamichelper.toxml(dynamicresult);
24 console.writeline(xmlresult);
25 }
显示结果如下:
(四)注意:对于我们添加的资源文件,需要对自动生成的.cs进行相应的修改。
资源文件自动添加之后,类以及相关的属性访问修饰符将默认设置为internal(程序集可见),因此我们必须对访问修饰符进行相应的修改,设置为public。
1 public class resources {2 [global::system.diagnostics.codeanalysis.suppressmessageattribute("microsoft.performance", "ca1811:avoiduncalledprivatecode")]
3 internal resources() {
4 }
5 public static string importsample {
6 get {
7 return resourcemanager.getstring("importsample", resourceculture);
8 }
9 }
dynamic web project|DynamicHelper类,实现dynamic对象与XML之间的互换
http://m.bbyears.com/shujuku/28659.html
推荐访问: