反射技能之一读取和设置类的习性

typeof:
是运算符,得到某1品类的 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
,写到这里时本人发觉二个很有意思的地点,Framework贰.0概念:public override
sealed Type GetType (),描述:重载获取表示内定项目的 Type
对象在Framework三.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()的区别:

设想如下代码

另一种艺术是:

(一)TypeOf():获得多少个Class的Type

public class MyClass
    {
        public MyClass()
        { }

Type t = myObj.GetType();

(二)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能够针对1随机一个档期的顺序的别样给定的实例。Object更像多少个”型”。Type才是三个类。

  以上的解析,就轻便通晓为啥通常只会在装箱或拆箱时阅览最多的Object
,而Type更加多时候在反射时用到,可有时在传递时仅须求三个Object时,恐怕会传递三个Type,然后再布局它。今后查阅本人代码吧!明白Object与Type这对代码优化是有好处的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图