当前位置: 澳门新濠3559 > 编程 > 正文

而Type多数被使用反射中,要想对一个类型实例的

时间:2019-11-29 05:50来源:编程
typeof: 是运算符,获得某一类型的 System.Type 对象。 Int32 t = new Int32(); Type t = typeof(int); 解释性说明: 要用C#反射技术的话,首先得引入System.Reflection命名空间,这个命名空间里的类,具有动

typeof:
是运算符,获得某一类型的 System.Type 对象。
Int32 t = new Int32();
Type t = typeof(int);

解释性说明:

要用C#反射技术的话,首先得引入System.Reflection 命名空间,这个命名空间里的类,具有动态加载程序集、类型,动态调用方法、设置和取得属性和字段的值、可以获取类型和方法的信息的功能。
要想对一个类型实例的属性或字段进行动态赋值或取值,首先得得到这个实例或类型的Type,微软已经为我们提供了足够多的方法。

GetType:
是方法,获取当前实例的类型。
int i = 10;
Console.WriteLine(i.GetType());

     Object 是所有类的基类,引用类型派生于Object。值类型虽然派生于valuetype(它本生派生于Object ,不过它们被定义了seal)。
Type 在MSDN描述为表示类型声明。而Type多数被使用反射中,可以方便得到类内部成员信息。Gettype 与typeof分别用可以在动态获得运行的类型和静态得到实例的类型
如下代码:
int k=0;
Type type = k.GetType();
Type type1 = typeof(Int32);

 1 Class MyClass
 2 {
 3   private int field;
 4   public int Field
 5   {
 6      get
 7        {
 8           return this.field;
 9         }
10      set
11         {
12            this.field = value;
13         }
14   }
15 }

区别:
GetType()是基类System.Object的方法,因此只有建立一个实例之后才能够被调用(初始化以后)
Typeof()的参数只能是int,string,String,自定义类型,且不能是实例

      考虑上面k.GetType()。如果上面k是一个引用类型同样也可以,在Type类中有一个GetType()方法,所以类是隐性继承于Object,Object中GetType方法,Type类也一样,同样隐性继承于Object,这才是关键,Reflection Type类中GetType,会发现如下Type.GetType(),Type.GetType (String)Type.GetType (String, Boolean) ,Type.GetType (String, Boolean, Boolean) Type类重载了很多GetType方法,仅Type.GetType()是被override ,写到这里时我发现一个很有意思的地方,Framework2.0定义:public override sealed Type GetType (),描述:重载获取表示指定类型的 Type 对象在Framework3.5定义为:public Type GetType(),在使用Reflecation工具后发现Object类中被这样定义 protected extern object MemberwiseClone(); 它的实现交给了实现具体类的GetType()方法,不过它是隐藏的方法。如果直接public Type GetType()编译时会提示,用new去覆盖。

如果有个这个类型的实例:
MyClass myObj = new MyClass();
我们要动态的为这个实例的属性Field赋值,那么得先得到这个实例的类型:

GetType() 和typeof()都返回System.Type的引用。

 

Type t = typeof(MyClass);

TypeOf() 和GetType()的区别:

考虑如下代码

另一种方法是:

(1)TypeOf():得到一个Class的Type

public class MyClass
    {
        public MyClass()
        { }

Type t = myObj.GetType();

(2)GetType():得到一个Class的实例的Type

        public new Type GetType()
        {
            return typeof(System.Int32);
        }
   }

只要我们得到了对象的类型那么我们就可以利用反射对这个对象“为所欲为”了,哈哈。

public void Test()
   {  
        MyClass myclass = new MyClass();
        Type type4= myclass.GetType();
  }

t.GetProperty("Field").SetValue(myObj,1,null);

结果是返回Int32,将上面代码做一下调整。

这样我们就为对象里的属性Field赋值了。如果把属性名和要赋的值写道配置文件里的话,我们就可以达到程序运行期间动态的为属性赋值了。
利用反射获取属性值的方法:

public void Test()
  {  
  Type Type5 = typeof(MyClass);
  }

int propValue = Convert.ToInt32(t.GetProperty("Field").GetValue(myObj,null));

结果是MyClass。

好了,关于利用反射动态的为对象的属性赋值取值就到这里了。

     说明GetType与typeof实现上机制是不一样的,GetType是在运行时动态获取,而typeof是静态获取。GetType方法返回一个表对象运行时的Type,Object替代了这种实现。Object可以GetType出来,但是new Type是出不来Object的,因为public abstract class Type,不可被实例化,Type类只是所有成员的索引角色。Object可以指向一任意一个类型的任何给定的实例。Object更像一个"型"。Type才是一个类。

  以上的分析,就不难理解为什么平时只会在装箱或拆箱时见到最多的Object ,而Type更多时候在反射时用到,可有时在传递时仅需要一个Object时,可能会传递一个Type,然后再构造它。现在查看自己代码吧!了解Object与Type这对代码优化是有好处的。

编辑:编程 本文来源:而Type多数被使用反射中,要想对一个类型实例的

关键词: