国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

淺談.NET反射的封裝_.Net教程

2024-07-10 12:51:42
字體:
來源:轉載
供稿:網友

推薦:解析ASP.NET用戶控件說明和添加事件
在WEB開發中經常有一些代碼是在很多地方重復出現的,象導航欄、用戶登錄/注冊和首頁上面的一些固定欄目等。這些可重用的代碼我們可以把它寫成一個通用模塊供需要的地方來引用,這樣做即節省了開發時間還方便以后的維護。 在ASP.NET的web編程中提供了一種叫做

.NET反射提供了在運行時獲取對象類型元數據的途徑,使程序可以動態地調用對象的屬性、方法。動態性帶來的代價是反射調用不像基于靜態類型的直接調用那樣簡潔,且缺乏類型檢查機制,失去了IDE智能提示,容易出錯;于是,不少朋友嘗試對.NET反射進行封裝。這個話題是仁者見仁,智者見智,這里我也談談自己對.NET反射封裝的思路,請先看下面的示例代碼:
  static void Main(string[] args)
  {
  Person liu = new Person("liu", 26);
  Reflector reflector = new Reflector(liu);
  //獲取屬性
  string name = reflector.Property<string>("Name");
  int age = 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();
  }
  public class Person
  {
  private string name;
  private int age;
  public Person(string name, int age)
  {
  this.name = name;
  this.age = age;
  }
  public string Name
  {
  get { return name; }
  }
  public int Age
  {
  get { return age; }
  set { age = value; }
  }
  public void SayHello(string who)
  {
  Console.WriteLine("Say Hello to " + who);
  }
  public int GetAge()
  {
  return age;
  }
  }
  相信您已經從代碼看出了封裝的思路:利用泛型和泛型委托為動態的反射添加靜態的類型約束。下面我們就來簡單看一下Reflector實現的關鍵部分:
  public delegate void Proc();
  public delegate void Proc<T1>(T1 arg1);
  public delegate void Proc<T1, T2>(T1 arg1, T2 args);
  public delegate void Proc<T1, T2, T3>(T1 arg1, T2 args, T3 arg3);
  public delegate void Proc<T1, T2, T3, T4>(T1 arg1, T2 args, T3 arg3, T4 arg4);
  public delegate void Proc<T1, T2, T3, T4, T5>(T1 arg1, T2 args, T3 arg3, T4 arg4, T5 arg5);
  public delegate R Func<R>();
  public delegate R Func<T1, R>(T1 arg1);
  public delegate R Func<T1, T2, R>(T1 arg1, T2 args);
  public delegate R Func<T1, T2, T3, R>(T1 arg1, T2 args, T3 arg3);
  public delegate R Func<T1, T2, T3, T4, R>(T1 arg1, T2 args, T3 arg3, T4 arg4);
  public delegate R Func<T1, T2, T3, T4, T5, R>(T1 arg1, T2 args, T3 arg3, T4 arg4, T5 arg5);
  public class Reflector
  {
  private object target;
  public object Target
  {
  get { return target; }
  }
  public T Property<T>(string name)
  {
  PropertyInfo pi = target.GetType().GetProperty(name, typeof(T));
  if (null != pi && pi.CanRead)
  {
  object value = pi.GetValue(target, null);
  if (null != value)
  {
  return (T)value;
  }
  }
  return default(T);
  }
  public T SetProperty<T>(string name, T value)
  {
  PropertyInfo pi = target.GetType().GetProperty(name, typeof(T));
  if (null != pi && pi.CanWrite)
  {
  pi.SetValue(target, value, null);
  }
  return value;
  }
  public Proc Proc(string name)
  {
  MethodInfo mi = target.GetType().GetMethod(name, Type.EmptyTypes);
  if (null != mi)
  {
  return Delegate.CreateDelegate(typeof(Proc), target, mi.Name, false) as Proc;
  }
  return null;
  }
  public Proc<T> Proc<T>(string name)
  {
  MethodInfo mi = target.GetType().GetMethod(name, new Type[] { typeof(T) });
  if (null != mi)
  {
  return Delegate.CreateDelegate(typeof(Proc<T>), target, mi.Name, false) as Proc<T>;
  }
  return null;
  }
  public Proc<T1, T2> Proc<T1, T2>(string name)
  {
  MethodInfo mi = target.GetType().GetMethod(name, new Type[] { typeof(T1), typeof(T2) });
  if (null != mi)
  {
  return Delegate.CreateDelegate(typeof(Proc<T1, T2>), target, mi.Name, false) as Proc<T1, T2>;
  }
  return null;
  }
  public Proc<T1, T2, T3> Proc<T1, T2, T3>(string name)
  {
  //...
  }
  public Proc<T1, T2, T3, T4> Proc<T1, T2, T3, T4>(string name)
  {
  //...
  }
  public Proc<T1, T2, T3, T4, T5> Proc<T1, T2, T3, T4, T5>(string name)
  {
  //...
  }
  public Func<R> Func<R>(string name)
  {
  MethodInfo mi = target.GetType().GetMethod(name, Type.EmptyTypes);
  if (null != mi)
  {
  return Delegate.CreateDelegate(typeof(Func<R>), target, mi.Name, false) as Func<R>;
  }
  return null;
  }
  public Func<T1, R> Func<T1, R>(string name)
  {
  MethodInfo mi = target.GetType().GetMethod(name, new Type[] { typeof(T1) });
  if (null != mi)
  {
  return Delegate.CreateDelegate(typeof(Func<T1, R>), target, mi.Name, false) as Func<T1, R>;
  }
  return null;
  }
  public Func<T1, T2, R> Func<T1, T2, R>(string name)
  {
  //...
  }
  }
  封裝的實現并不復雜,只是利用了泛型和泛型委托為調用者提供了強類型的屬性和方法;除屬性和方法的名稱是動態的以為,其余的都可以加上類型約束。歡迎就此話題多多交流!

 

分享:淺析C#編程實現動態生成Word文檔
如何用C#編程實現動態生成Word文檔并填充數據的效果呢?要使用C#操作word,首先要添加引用: 1、添加引用-COM-Microsoft Word 11.0 Object Library 2、在.cs文件中添加 using Word; 下面的例子中包括C#對Word文檔的創建、插入表格、設置樣式等操作: (例子

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 双峰县| 北安市| 云阳县| 万盛区| 大化| 冀州市| 杭锦后旗| 吉林省| 平江县| 东明县| 台湾省| 盐源县| 枞阳县| 专栏| 蓝田县| 新疆| 保靖县| 获嘉县| 柳林县| 专栏| 和硕县| 民县| 宣武区| 偏关县| 怀化市| 广德县| 东海县| 鞍山市| 松桃| 永善县| 四川省| 石狮市| 长治县| 龙游县| 永定县| 岢岚县| 崇礼县| 万山特区| 托克托县| 白玉县| 银川市|