前言:时间紧,先写关键代码,以后优化:

  在此感谢其他博友分享的文章,参考文章:C#反射委托创建器

1-定义含有委托的类:

public class TimeCycle
{
/// <summary>
/// 唯一标识
/// </summary>
public int ID { get; set; }
/// <summary>
/// 静态方法委托(只定义委托参数即可)
/// </summary>
public Action<TimeCycle, string> Action { get; set; }
/// <summary>
/// 实例方法委托(实例类型+定义委托参数)
/// </summary>
public Action<MyTipsService, TimeCycle, string> Action2 { get; set; }
}

2-初始化类:

创建委托方法1--创建静态方法的委托,只需要2个参数:委托类型和方法信息:

Delegate.CreateDelegate(typeof(Action<TimeCycle, string>), myTipType.GetMethod("SendTipsToDingding"))

创建委托方法2--创建实例方法的委托,需要2+1个参数:除了上面的委托类型和方法信息;还有,,,还有被委托方法对应的实例类型!!!

即:Action<TimeCycle, string> 类型必须改为含有实例类型的委托:Action<MyTipsService,TimeCycle, string>,至于为什么?  应该是因为,非静态方法的委托调用需要实例依托在实例的基础上,只有实例才能权利调用实例方法。

所以,实例方法创建的委托必须得包含实例类型才能正常创建。

备注:创建委托失败常出现的一个错误,需要对委托的是否静态方法和对应参数进行检查:

System.ArgumentException:“无法绑定到目标方法,因其签名或安全透明度与委托类型的签名或安全透明度不兼容。”

public partial class MyTipsService : ServiceBase
{ public void Test()
{
Type myTipType = typeof(MyTipsService);
//创建静态方法委托1:
TimeCycle timeCycle1 = new TimeCycle
{
ID = ,
Action = (Action<TimeCycle, string>)Delegate.CreateDelegate(typeof(Action<TimeCycle, string>), myTipType.GetMethod("MyProjectBugTips")),
};
//创建实例方法委托2:
TimeCycle timeCycle2 = new TimeCycle
{
ID = ,
Action2 = (Action<MyTipsService, TimeCycle, string>)Delegate.CreateDelegate(typeof(Action<MyTipsService, TimeCycle, string>), myTipType.GetMethod("SendTipsToDingding")),
}; var a = ;
} #region 获取提醒消息 /// <summary>
/// 每天上下班提醒
/// </summary>
public void SendTipsToDingding(TimeCycle timeCycle, string typeStr)
{ } /// <summary>
/// 我的项目BUG的提醒
/// </summary>
public static void MyProjectBugTips(TimeCycle timeCycle, string typeStr)
{ } #endregion }

通过对象方法获取委托_C#反射获取委托_的更多相关文章

  1. Asp.Net SignalR 使用记录 技术回炉重造-总纲 动态类型dynamic转换为特定类型T的方案 通过对象方法获取委托_C#反射获取委托_ .net core入门-跨域访问配置

    Asp.Net SignalR 使用记录   工作上遇到一个推送消息的功能的实现.本着面向百度编程的思想.网上百度了一大堆.主要的实现方式是原生的WebSocket,和SignalR,再次写一个关于A ...

  2. java.lang.reflect.Method.getAnnotation()方法示例【通过反射获取到方法对象再获取方法对象上的注解信息】

    转: java.lang.reflect.Method.getAnnotation()方法示例 java.lang.reflect.Method.getAnnotation(Class <T&g ...

  3. 6.12---前提两个对象的成员必须一致,才能将有数据的对象将数据传给反射获取的对象conver(有数据对象,目标对象)

    //// Source code recreated from a .class file by IntelliJ IDEA// (powered by Fernflower decompiler)/ ...

  4. org.reflections 接口通过反射获取实现类源码研究

    org.reflections 接口通过反射获取实现类源码研究 版本 org.reflections reflections 0.9.12 Reflections通过扫描classpath,索引元数据 ...

  5. javaWEB总结(4):ServletContext对象方法

    前言:之前每次学到ServletContext对象都会抗拒,跳着学,后面才发现有很多不懂的原理都在这个对象里面,后悔莫及,所以今天特地把他单放在一篇文章里,算是对他的忏悔. 1.什么是ServletC ...

  6. day03 Django目录结构与reques对象方法

    day03 Django目录结构与reques对象方法 今日内容概要 django主要目录结构 创建app注意事项(重点) djago小白必会三板斧 静态文件配置(登录功能) requeste对象方法 ...

  7. Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别

    Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别 ​ 在工作中遇到一个问题,就是你需要去判断某个字符串是不是对象的某个成员属性名,然后根据判断结果 ...

  8. java通过读取本地文件获取反射方法参数,执行对象方法

    运用到的知识点 IO流, 集合properties   反射 在工程目录下新建file   config.properties #one time only can run one method cl ...

  9. 反射----获取class对象的五种方法

    反射Reflection 配合注解使用会格外强大,反射注解,天生一对 类如何加载? 动态语言和静态语言.我知道是什么,不用总结了. 由于反射,Java可以称为准动态语言. 允许通过反射获得类的全部信息 ...

随机推荐

  1. java之JavaBean

    JavaBean是一种java语言编写而成的可重用组件. 所谓JavaBean,是指符合以下标准的java类: 类是公共的: 有一个无参的公共构造器: 有属性,属性一般是私有的,且有对应的set.ge ...

  2. jQuery 源码解析(二十四) DOM操作模块 包裹元素 详解

    本节说一下DOM操作模块里的包裹元素子模块,该模块可将当前匹配的元素替换指定的DOM元素,有如下方法: wrap(html)               ;在每个匹配元素的外层添加一层DOM元素   ...

  3. Quartz.NET总结(三)如配置jobs

    前两篇文章,已经介绍了Quartz.NET的使用和Cron表达式表达式的写法,今天说一说Quartz的配置,Quartz相关的配置有三个quartz.config.quartz_jobs.xml.lo ...

  4. windows 下安装beego

    好久没写博客了,最近忙于一些杂事,看见有几个博友留言了,未能及时回复,稍后晚点回复诸位博友.不多说了,windows安装beego(请先确保git环境已安装并设置了git环境变量.这个简单网上很多教程 ...

  5. JS基础语法---arguments对象伪数组

    引入: //计算两个数字的和 function f1(x, y) { return x + y; } //计算三个数字的和 function f2(x, y, z) { return x + y + ...

  6. swift字符串截取实例

    截取字符串 let deviceStr = deviceInfoLabel.attributedText?.string var device  = "" if let len : ...

  7. angularjs 实现猜数字大小的功能

    <body ng-app="myapp" ng-controller="myCtrl"> <h2>猜一猜,多大值?(1-1000)< ...

  8. 简单的jquery表单验证+添加+删除+全选/反选

    //布局 <body> <h4><a href="#">首页</a>><a href="#"> ...

  9. 如何将RAC数据库的 RMAN Disk 备份 Restore 到另一个节点上的单个实例 (Doc ID 415579.1)

    HowTo Restore RMAN Disk backups of RAC Database to Single Instance On Another Node (Doc ID 415579.1) ...

  10. SQL注入:HEAD注入

    HEAD注入原理 HEAD注入顾名思义就是在传参的时候,将我们的数据构建在http头部. HEAD注入的使用场景 为什么网站要记录你的ip或者请求头,是为了方便你的二次登陆,区分你的登陆地址和设备,可 ...