C# 之门课程系列-15[通俗易懂]

C# 之门课程系列-15[通俗易懂]元数据和反射大多数程序都要处理数据,包括读、写、操作和显示数据。(图形也是一种数据的形式)然而,对于某些程序来说,它们操作的数据不是数字、文本或

欢迎大家来到IT世界,在知识的湖畔探索吧!

元数据和反射

大多数程序都要处理数据,包括读、写、操作和显示数据。(图形也是一种数据的形式)

然而,对于某些程序来说,它们操作的数据不是数字、文本或图形,而是程序和程序类型本身的信息。

  • 有关程序及其类型的数据被称为元数据(metadata),它们保存在程序的程序集中。
  • 程序在运行时,可以查看其他程序集或其本身的元数据。一个运行的程序查看本身的元数据或其他程序的元数据的行为叫做反射(reflection)。

要使用反射,必须使用System.Reflection命名空间

Type类

C# 之门课程系列-15[通俗易懂]

对于程序中用到的每一个类型,CLR都会创建一个包含这个类型信息的Type类型的对象.

获取Type对象

 class Book
        {
            public int Qty = 1;
            public string Title { get; set; }
            public Book(string title)
            {
                this.Title = title;
            }
        }

欢迎大家来到IT世界,在知识的湖畔探索吧!

欢迎大家来到IT世界,在知识的湖畔探索吧! static void Main(string[] args)
        {
            Book book = new Book("A");
            Type t = book.GetType();
            FieldInfo[] fi = t.GetFields();
            foreach (var item in fi)
            {
                Console.WriteLine("Filed:{0},Value:{1}", item.Name,item.GetValue(book));
            }
            Console.ReadKey();
        }

优缺点

优点:

1、反射提高了程序的灵活性和扩展性。

2、降低耦合性,提高自适应能力。

3、它允许程序创建和控制任何类的对象,无需提前硬编码目标类。

缺点:

1、性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。

2、使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,反射却绕过了源代码的技术,因而会带来维护的问题,反射代码比相应的直接代码更复杂。

用途

它允许在运行时查看特性(attribute)信息。

它允许审查集合中的各种类型,以及实例化这些类型。

它允许延迟绑定的方法和属性(property)。

它允许在运行时创建新类型,然后使用这些类型执行一些任务。

试试这个

 public class Material
    {
        public string MLFB { get; set; }
        public string SerialNo { get; set; }
        public void Print()
        {
            Console.WriteLine("MLFB:{0},SerialNo:{1}", this.MLFB, this.SerialNo);
        }
    }
欢迎大家来到IT世界,在知识的湖畔探索吧! static void Main(string[] args)
        {
            Type t = typeof(Material);
            object obj = t.Assembly.CreateInstance(t.FullName);
            PropertyInfo mlfb = t.GetProperty("MLFB");
            mlfb.SetValue(obj, "6ES7-0001");
            PropertyInfo serialno = t.GetProperty("SerialNo");
            serialno.SetValue(obj, "SV-00001");
            MethodInfo m = t.GetMethod("Print");
            m.Invoke(obj,null);
            Console.ReadKey();
        }

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/18310.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信