• C#反射命名空间和装配件的关系(网上摘录)


    C#反射命名空间和装配件的关系

    很多人对这个概念不清楚,对于一个.NET程序员来说,有必要搞清楚这些概念。

    命名空间类似于java的package(包),但又不是完全相同,因为Java的包必须按照目录的位置来摆放,而.NET就不需要了,它只需要添 加相关的引用就行了。

    装配件是什么?从字面意思根本无法明白它在C#中是什么,通俗的讲,在形成最终的.exe或.dll之前,那些不相关的和相关的东西(比如说很多 类)要打成包组装在一起,这些东西就叫做装配件。当然,我们直接把它理解为exe和dll。

    装配件的命名空间的关系不是一一对应,也不是互相包含的,一个装配件可以有多个命名空间,一个命名空间也可以在多个装配件中存在。这样说也许我们还 不明白,那就举个例子:

    1. //装配件A:  
    2. namespace N1  
    3. {  
    4.    public class AC1 {…}  
    5.    public class AC2 {…}  
    6. }  
    7. namespace N2  
    8. {  
    9.    public class AC3 {…}  
    10.    public class AC4{…}  
    11. }  
    12. //装配件B:  
    13. namespace N1  
    14. {  
    15.    public class BC1 {…}  
    16.    public class BC2 {…}  
    17. }  
    18. namespace N2  
    19. {  
    20.    public class BC3 {…}  
    21.    public class BC4{…}  } 

    这两个装配件中都有命名空间N1、N2,而且各声明了2个类,这样是完全可以的,然后我们在一个应用程序中引用装配件A,那么我们能在这个应用程序 下看到N1下的类为AC1、AC2,N2下的类为AC3、AC4。

    如果我们去掉对A的引用,然后去引用B装配件,那在这个应用程序中我们只能看到N1下的BC1、BC2,N2下的BC3、BC4。

    同时引用A、B,当然就能看到以上所有的类。

    到这里,我们可以清楚一个概念了,命名空间只是说明一个类型是哪个族的,比如有人是汉族、有人是回族;而装配件表明一个类型住在哪上面我们说了,装 配件(dll或exe)是一个类型居住的地方,那么在一个程序中要使用一个类,就必须告诉编译器这个类住在哪儿,编译器才能找到它,也就是说必须引用该装配件。

    C#反射的一些运用

    反射的基本概念就是上面那几条了,那反射有哪些运用呢?

    (1)通过反射获取类型

    获取类型有两种方法:一种是得到实例对象

    这个时侯我仅仅是得到这个实例对象,得到的方式也许是一个object的引用,也许是一个接口的引用,但是我并不知道它的确切类型,我需要了解,那 么就可 以通过调用System.Object上声明的方法GetType来获取实例对象的类型对象,比如在某个方法内,我需要判断传递进来的参数是否实现了某个 接口,如果实现了,则调用该接口的一个方法:

    1.   …  
    2.  public void Process( object processObj )  
    3.  
    4. {  
    5.  Type t = processsObj.GetType();  
    6.  if( t.GetInterface(“ITest”) !=null )  
    7.     …  
    8. }  
    9. … 

    另外一种获取类型的方法是通过Type.GetType以及Assembly.GetType方法,如:    

    1. Type t = Type.GetType(“System.String”); 

    需要注意的是,前面我们讲到了命名空间和装配件的关系,要查找一个类,必须指定它所在的装配件,或者在已经获得的Assembly实例上面调用 GetType。

    本装配件中类型可以只写类型名称,另一个例外是mscorlib.dll,这个装配件中声明的类型也可以省略装配件名称(.Net装配件编译的时 候,默认都引用了mscorlib.dll,除非在编译的时候明确指定不引用它),比如:

    System.String是在mscorlib.dll中声明的,上面的Type t = Type.GetType(“System.String”)是正确的

    System.Data.DataTable是在System.Data.dll中声明的,那么:

    Type.GetType(“System.Data.DataTable”)就只能得到空引用。

    必须: /Type t = Type.GetType("System.Data.DataTable,System.Data,Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");

     

    有个Test实体类:

                public class Test

      {
      int id=0;
      string name;
      double source = 0.0;
      public int Id
      { get; set; }
      public string Name
      { get; set; }
      public double Source
      { get; set; }
      }

    有时候我需要遍历某个Test对象的属性(名称和值)或者我很懒而且那个实体类的属性又特别多,那可以用以下方式:

      static void Main(string[] args)
      {
      //Assembly ass=Assembly.LoadFrom(@"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client\System.Data.dll");
      //Type tt = ass.GetType();
      //Type t = Type.GetType("System.Data.DataTable,System.Data,Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");

      Test ts = new Test();
      ts.Id = 99;
      ts.Name = "hh";
      ts.Source = 90;
      string str= ts.GetType().Namespace;
      foreach (PropertyInfo pi in ts.GetType().GetProperties())
      {
      Console.WriteLine(pi.Name+": "+pi.GetValue(ts,null));
      }
      Console.ReadLine();
      }
    今天 先整理这些,明天继续
  • 相关阅读:
    子库存安全性控制
    检查装配件属性
    检查加工费是否有父件
    检查委外货位
    只允许操作外协任务
    检查是否存在工艺路线
    不能取组织ID
    加宽任务号宽度
    采购订单供应商地点必输
    只显示标准采购订单
  • 原文地址:https://www.cnblogs.com/6303c/p/1877247.html
Copyright © 2020-2023  润新知