C#使用反射机制实现延迟绑定

反射允许我们在编译期或运行时获取程序集的元数据,通过反射可以做到:

● 创建类型的实例
● 触发方法
● 获取属性、字段信息
● 延迟绑定
......

如果在编译期使用反射,可通过如下2种方式获取程序集Type类型:

  • 1、Type类的静态方法

Type type = Type.GetType("somenamespace.someclass");

  • 2、通过typeof

Type type = typeof(someclass);

如果在运行时使用反射,通过运行时的Assembly实例方法获取Type类型:

Type type = asm.GetType("somenamespace.someclass");

获取反射信息

有这样的一个类:

    public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public float Score { get; set; }

        public Student()
        {
            this.Id = -1;
            this.Name = string.Empty;
            this.Score = 0;
        }

        public Student(int id, string name, float score)
        {
            this.Id = id;
            this.Name = name;
            this.Score = score;
        }

        public string DisplayName(string name)
        {
            return string.Format("学生姓名:{0}", name);
        }

        public void ShowScore()
        {
            Console.WriteLine("学生分数是:" + this.Score);
        }
    }

通过如下获取反射信息:

        static void Main(string[] args)
        {
            Type type = Type.GetType("ConsoleApplication1.Student");
            //Type type = typeof (Student);

            Console.WriteLine(type.FullName);
            Console.WriteLine(type.Namespace);
            Console.WriteLine(type.Name);

            //获取属性
            PropertyInfo[] props = type.GetProperties();
            foreach (PropertyInfo prop in props)
            {
                Console.WriteLine(prop.Name);
            }

            //获取方法
            MethodInfo[] methods = type.GetMethods();
            foreach (MethodInfo method in methods)
            {
                Console.WriteLine(method.ReturnType.Name);
                Console.WriteLine(method.Name);
            }
            Console.ReadKey();
        }

延迟绑定

在通常情况下,为对象实例赋值是发生在编译期,如下:

Student stu = new Student();
stu.Name = "somename";

而"延迟绑定",为对象实例赋值或调用其方法是发生在运行时,需要获取在运行时的程序集、Type类型、方法、属性等。

            //获取运行时的程序集
            Assembly asm = Assembly.GetExecutingAssembly();

            //获取运行时的Type类型
            Type type = asm.GetType("ConsoleApplication1.Student");

            //获取运行时的对象实例
            object stu = Activator.CreateInstance(type);

            //获取运行时指定方法
            MethodInfo method = type.GetMethod("DisplayName");
            object[] parameters = new object[1];
            parameters[0] = "Darren";

            //触发运行时的方法
            string result = (string)method.Invoke(stu, parameters);
            Console.WriteLine(result);
            Console.ReadKey();

到此这篇关于C#使用反射机制实现延迟绑定的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • c# 反射+自定义特性保存数据至本地

    最近在项目过程中遇到了保存数据的需求,对实体类的部分数据进行保存,打算采用反射+自定义特性来实现数据保存,利于扩展 1. 采用反射实现能够灵活获取要保存的数据,由于只需要保存实体类(Model)的部分数据,因此采用自定义特性标记需要保存的数据,同时数据要求以.csv格式保存,添加自定义特性有利于对表头进行描述 2. 实现自定义特性 public class ResultAttribute : Attribute { private bool _IsSave; /// <summary> ///

  • 详解C#通过反射获取对象的几种方式比较

    目录 使用标准反射的 Invoke 方法 使用 Activator.CreateInstance 使用 Microsoft.Extensions.DependencyInjection Natasha 使用表达式 Expression 使用 Emit 对比测试 总结 相关链接 在本文中,对比了常见的几种反射的方法,介绍了它们分别应该如何使用,每种的简易度和灵活度,然后做了基准测试,一起看看这之间的性能差距. 按照使用的简易度和灵活度,做了下边的排序,可能还有一些其他的反射方式,比如 Source

  • C#中的反射(System.Reflection)

    一.获取程序集Assembly 1.获取当前运行的程序集 System.Reflection.Assembly[] asm = AppDomain.CurrentDomain.GetAssemblies(); // Assembly b = Assembly.GetExecutingAssembly(); 2.获取指定文件的程序集:Load,LoadFrom,LoadFile方法. Assembly c = Assembly.Load("mscorlib.dll");//如果你引用了程

  • C#反射调用拓展类方法实例代码

    目录 C# 类拓展方法 C#反射调用拓展类 总结 今天封装Protobuf封包时候遇到一个问题: Protobuf的反序列化方法MergeFrom,是写在扩展类里的:c#拓展类 C# 类拓展方法 要求: 扩展方法类必须为静态类: 拓展方法必须为静态方法,参数为this+需拓展类对象: 多个类拓展方法可以写在一个拓展类中: public class TestExtension { public string Test1() { return "test"; } } public stat

  • C#反射(Reflection)详解

    目录 一.System.Type类 1.Type属性 2.方法 二.Assembly类 1.获取在程序集中定义的类型的详细信息 2.获取自定义特性的详细信息 1.编写自定义特性 2.对VectorClass和其成员使用自定义特性 3.通过反射获取程序集VectorClass和其成员的自定义特性 C#反射技术主要基于System.Type类和System.Reflection.Assemble类,通过Type类可以访问关于任何数据类型的信息,Assemble类用于访问给定程序集的相关信息,或把这个

  • c# 反射用法及效率对比

    反射实例化类 public class Person { public string Name { get; set; } public Person(string name) { this.Name = name; } public string Say(string msg) { return $"{Name}: {msg}"; } } class Program { // 测试次数 const int count = 10000000; static void Main(stri

  • 关于C#反射 你需要知道的

    通常,反射用于动态获取对象的类型.属性和方法等信息.今天带你玩转反射,来汇总一下反射的各种常见操作,捡漏看看有没有你不知道的. 获取类型的成员 Type 类的 GetMembers 方法用来获取该类型的所有成员,包括方法和属性,可通过 BindingFlags 标志来筛选这些成员. using System; using System.Reflection; using System.Linq; public class Program { public static voidMain() {

  • C#利用反射实现多数据库访问

    在上一篇文章中讲解了什么是反射,以及利用反射可以获取程序集里面的哪些内容.在平时的项目中,可能会遇到项目需要使用多种数据库,这篇文章中将会讲解如何利用反射实现访问多种数据库. 项目整体结构如下图所示: 1.Database.Instance是一个类库文件,IDBHelper是一个接口,封装的访问数据库数据的CURD方法,OracleDBHelper和SQLServerDBHelper类实现IDBHelper接口,分别用来访问Oracle数据库和SQL Server数据库,接口和类的定义如下: I

  • C#反射机制介绍

    先看下面一个动物点名系统的简单例子: 有一个Animal的抽象动物父类,里面定义了Name.Age两个属性和一个Shout()方法,Animal类定义如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Animal { /// <summary> /// 抽象父类 /// </sum

  • C#反射使用方法过程及步骤

    C#反射使用方法过程及步骤,供大家参考,具体内容如下 1. 定义要访问类的全名 2. 获取该类的类型 3. 实例化该类 4. 获取该类的字段.属性,方法 5. 设置该字段或属性内容,或调用其方法 从而达到使用字符串访问相应类的目的. 示例: 1. 根据窗口类的名称,产生一个新的窗口,相当于new 窗口类 //1. 定义窗口类名称:(窗口类的字符串名字,需要全路径名,否则获取不到TYPE) string customClassName = @"IBAutoDeal.IBDealForms.&quo

  • 详解C# 反射(Reflection)

    C# 反射(Reflection) 反射指程序可以访问.检测和修改它本身状态或行为的一种能力. 程序集包含模块,而模块包含类型,类型又包含成员.反射则提供了封装程序集.模块和类型的对象. 您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型.然后,可以调用类型的方法或访问其字段和属性. 优缺点 优点: 1.反射提高了程序的灵活性和扩展性. 2.降低耦合性,提高自适应能力. 3.它允许程序创建和控制任何类的对象,无需提前硬编码目标类. 缺点: 1.性能问题:使用反射基本

随机推荐