利用反射获得委托和事件以及创建委托实例和添加事件处理程序

简介:

最近一些都在看关于反射的内容,然后在网上大多数都是通过反射获得类型中方法,属性、字段这样的文章, 但是对于如何获得委托类型怎么去实现的却没有, 所以写下这边篇文章来让自己以后很好的复习以及想了解的朋友做参考。

一、 利用反射获得委托类型并创建委托实例

using System;
using System.Reflection;

namespace ConsoleApplication1
{
   
    public  class Test
    {
        
        public delegate void delegateTest(string s);
        public void method1(string s)
        {
            Console.WriteLine("Create Delegate Instance: " + s);
        }
       
    }

    class Program
    {
        static void Main(string[] args)
        {
            Test test = new Test();
            Type t = Type.GetType("ConsoleApplication1.Test");
            // 因为委托类型编译后是作为类的嵌套类型的,所以这里通过GetNestedType(String s)的方法来获得委托类型。
            Type nestType = t.GetNestedType("delegateTest");

            MethodInfo method =test.GetType().GetMethod("method1",  BindingFlags.Public | BindingFlags.Static|BindingFlags.Instance);
            if (method != null)
            {
                // 创建委托实例
                Delegate method1 = Delegate.CreateDelegate(nestType, test, method);
                //动态调用委托实例
                method1.DynamicInvoke("Hello");
            }

            Console.Read();
        }
    } 
}


二、 利用反射获得事件类型和绑定事件处理程序

using System;
using System.Reflection;

namespace ConsoleApplication2
{
    public class Test
    {
        public event EventHandler TestEvent;
        public void Triggle()
        {
            if (TestEvent != null)
            {
                TestEvent(this, null);
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Test testT=new Test();
            EventInfo eventinfo = typeof(Test).GetEvent("TestEvent");
            if (eventinfo != null)
            {
                // 为事件动态绑定处理程序
                eventinfo.AddEventHandler(testT, new EventHandler(triggleEvent));
                testT.Triggle();
            }
            Console.Read();

        }
        public static void triggleEvent(object sender, EventArgs e)
        {
            Console.WriteLine("Event has been Triggled");
        }
    }
}


希望这些使大家对放射有个更好的理解。


     本文转自LearningHard 51CTO博客,原文链接:http://blog.51cto.com/learninghard/1034785,如需转载请自行联系原作者






相关文章
|
2月前
|
C#
C#一分钟浅谈:委托与事件的实现方式
本文详细介绍了C#编程中委托与事件的基础知识及应用场景。首先解释了委托的概念,包括定义与使用方法;接着介绍了事件这一基于委托的特殊类型,展示了如何在类中定义事件及跨类订阅与处理事件;最后讨论了常见问题如事件未处理异常、重复订阅及内存泄漏等,并提出了相应的解决方案。通过本文,读者将全面掌握委托与事件的使用技巧,提升应用程序的设计与开发水平。
118 7
|
6月前
|
存储 安全 C#
C# - 委托与事件
这篇文档介绍了C#中的委托和事件。委托是存储方法引用的类型,支持回调、事件处理,具有引用方法、类型安全、多播性等特性,并在异步编程中发挥作用。事件是委托的封装,提供保护和订阅机制,防止外部直接访问。当需要在类内部控制方法调用,防止外部误触发时,可使用事件。
|
C#
C# 委托和事件
C# 委托和事件
98 0
C# 委托和事件
|
C# 设计模式 编译器
|
Web App开发 安全 C#
|
监控 C# Windows
|
C# 安全 C++
C#基础篇 - 理解委托和事件
委托 委托类似于C++中的函数指针(一个指向内存位置的指针)。委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针。简单理解,委托是一种可以把函数当做参数传递的类型。很多情况下,某个函数需要动态地去调用某一类函数,这时候我们就在参数列表放一个委托当做函数的占位符。
1251 0
下一篇
无影云桌面