仓酷云

标题: ASP.NET网站制作之谈.NET反射的封装 [打印本页]

作者: 深爱那片海    时间: 2015-1-16 22:23
标题: ASP.NET网站制作之谈.NET反射的封装
语言是不是不是最重要的?.NET反射供应了在运转时猎取工具范例元数据的路子,使程序能够静态地挪用工具的属性、办法。静态性带来的价值是反射挪用不像基于静态范例的间接挪用那样简便,且缺少范例反省机制,得到了IDE智能提醒,简单堕落;因而,很多伴侣实验对.NET反射举行封装。这个话题是仁者见仁,智者见智,这里我也谈谈本人对.NET反射封装的思绪,请先看上面的示例代码:
  staticvoidMain(string[]args)
  {
  Personliu=newPerson("liu",26);
  Reflectorreflector=newReflector(liu);
  //猎取属性
  stringname=reflector.Property<string>("Name");
  intage=reflector.Property<int>("Age");
  Console.WriteLine(name+""+age);
  //修正属性
  age=reflector.SetProperty<int>("Age",27);
  Console.WriteLine(name+""+age);
  //猎取历程
  Proc<string>sayHello=reflector.Proc<string>("SayHello");
  sayHello("Ling");
  //猎取函数
  Func<int>getAge=reflector.Func<int>("GetAge");
  age=getAge();
  Console.WriteLine(age);
  Console.ReadLine();
  }
  publicclassPerson
  {
  privatestringname;
  privateintage;
  publicPerson(stringname,intage)
  {
  this.name=name;
  this.age=age;
  }
  publicstringName
  {
  get{returnname;}
  }
  publicintAge
  {
  get{returnage;}
  set{age=value;}
  }
  publicvoidSayHello(stringwho)
  {
  Console.WriteLine("SayHelloto"+who);
  }
  publicintGetAge()
  {
  returnage;
  }
  }
  信任您已从代码看出了封装的思绪:使用泛型和泛型托付为静态的反射增加静态的范例束缚。上面我们就来复杂看一下Reflector完成的关头部分:
  publicdelegatevoidProc();
  publicdelegatevoidProc<T1>(T1arg1);
  publicdelegatevoidProc<T1,T2>(T1arg1,T2args);
  publicdelegatevoidProc<T1,T2,T3>(T1arg1,T2args,T3arg3);
  publicdelegatevoidProc<T1,T2,T3,T4>(T1arg1,T2args,T3arg3,T4arg4);
  publicdelegatevoidProc<T1,T2,T3,T4,T5>(T1arg1,T2args,T3arg3,T4arg4,T5arg5);
  publicdelegateRFunc<R>();
  publicdelegateRFunc<T1,R>(T1arg1);
  publicdelegateRFunc<T1,T2,R>(T1arg1,T2args);
  publicdelegateRFunc<T1,T2,T3,R>(T1arg1,T2args,T3arg3);
  publicdelegateRFunc<T1,T2,T3,T4,R>(T1arg1,T2args,T3arg3,T4arg4);
  publicdelegateRFunc<T1,T2,T3,T4,T5,R>(T1arg1,T2args,T3arg3,T4arg4,T5arg5);
  publicclassReflector
  {
  privateobjecttarget;
  publicobjectTarget
  {
  get{returntarget;}
  }
  publicTProperty<T>(stringname)
  {
  PropertyInfopi=target.GetType().GetProperty(name,typeof(T));
  if(null!=pi&&pi.CanRead)
  {
  objectvalue=pi.GetValue(target,null);
  if(null!=value)
  {
  return(T)value;
  }
  }
  returndefault(T);
  }
  publicTSetProperty<T>(stringname,Tvalue)
  {
  PropertyInfopi=target.GetType().GetProperty(name,typeof(T));
  if(null!=pi&&pi.CanWrite)
  {
  pi.SetValue(target,value,null);
  }
  returnvalue;
  }
  publicProcProc(stringname)
  {
  MethodInfomi=target.GetType().GetMethod(name,Type.EmptyTypes);
  if(null!=mi)
  {
  returnDelegate.CreateDelegate(typeof(Proc),target,mi.Name,false)asProc;
  }
  returnnull;
  }
  publicProc<T>Proc<T>(stringname)
  {
  MethodInfomi=target.GetType().GetMethod(name,newType[]{typeof(T)});
  if(null!=mi)
  {
  returnDelegate.CreateDelegate(typeof(Proc<T>),target,mi.Name,false)asProc<T>;
  }
  returnnull;
  }
  publicProc<T1,T2>Proc<T1,T2>(stringname)
  {
  MethodInfomi=target.GetType().GetMethod(name,newType[]{typeof(T1),typeof(T2)});
  if(null!=mi)
  {
  returnDelegate.CreateDelegate(typeof(Proc<T1,T2>),target,mi.Name,false)asProc<T1,T2>;
  }
  returnnull;
  }
  publicProc<T1,T2,T3>Proc<T1,T2,T3>(stringname)
  {
  //...
  }
  publicProc<T1,T2,T3,T4>Proc<T1,T2,T3,T4>(stringname)
  {
  //...
  }
  publicProc<T1,T2,T3,T4,T5>Proc<T1,T2,T3,T4,T5>(stringname)
  {
  //...
  }
  publicFunc<R>Func<R>(stringname)
  {
  MethodInfomi=target.GetType().GetMethod(name,Type.EmptyTypes);
  if(null!=mi)
  {
  returnDelegate.CreateDelegate(typeof(Func<R>),target,mi.Name,false)asFunc<R>;
  }
  returnnull;
  }
  publicFunc<T1,R>Func<T1,R>(stringname)
  {
  MethodInfomi=target.GetType().GetMethod(name,newType[]{typeof(T1)});
  if(null!=mi)
  {
  returnDelegate.CreateDelegate(typeof(Func<T1,R>),target,mi.Name,false)asFunc<T1,R>;
  }
  returnnull;
  }
  publicFunc<T1,T2,R>Func<T1,T2,R>(stringname)
  {
  //...
  }
  }
  封装的完成其实不庞大,只是使用了泛型和泛型托付为挪用者供应了强范例的属性和办法;除属性和办法的称号是静态的觉得,其他的都能够加上范例束缚。接待就此话题多多交换!
那做企业软件是不是最好用J2EE?
作者: 金色的骷髅    时间: 2015-1-19 10:28
是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。
作者: 莫相离    时间: 2015-2-1 16:01
是目前ASP在UNIX/Linux上的应用可以说几乎为0)。所以平台的局限性和ASP自身的安全性限制了ASP的广泛应用。
作者: 小女巫    时间: 2015-2-7 07:39
在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。
作者: 简单生活    时间: 2015-2-21 01:53
主流网站开发语言之PHPHP的全名非常有趣,它是一个巢状的缩写名称——“PHP:HypertextPreprocessor”,打开缩写还是缩写。PHP是一种HTML内嵌式的语言(就像上面讲的ASP那样)。而PHP独特的语法混合了C,Java,Perl以及PHP式的新语法。它可以比CGI或者Perl更快速地执行动态网页。
作者: 柔情似水    时间: 2015-3-6 19:33
我的意思是.net好用,从功能上来说比JAVA强还是很明显的。
作者: 再见西城    时间: 2015-3-13 06:57
能产生和执行动态、交互式、高效率的站占服务器的应用程序。运用ASP可将VBscript、javascript等脚本语言嵌入到HTML中,便可快速完成网站的应用程序,无需编译,可在服务器端直接执行。容易编写。
作者: 活着的死人    时间: 2015-3-20 15:28
ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2