【www.gdgbn.com--Access】

自定义一个dynamichelper类,主要是实现dynamic对象与xml之间的互换操作。

toxml(dynamic dynamicobject)将传入的dynamicobject转换为xml。

toobject(string xml, dynamic dynamicresult) 将传入的string,先转换成xelement元素,然后再构建一个dynamicxelement对象,返回结果。

toobject(string xml)直接将xml转换为dynamicxelement对象。

 1 public class dynamichelper
 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 : dynamicobject
 2     {
 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         }

本文来源:http://www.gdgbn.com/shujuku/28659/