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

  在此感谢其他博友分享的文章,参考文章: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之模板方法设计模式

    抽象类体现的就是一种模板模式的设计.抽象类作为多个子类的通用模板.子类在抽象类的基础上进行扩张和改造,但子类总体上会保留抽象类的行为方式. 解决的问题: 当功能内部一部分实现是确定的,一部分实现是不确 ...

  2. workerman连接失败方法

    workerman链接失败方法 1 防火墙关闭 2 端口开启 3 改成websocket协议

  3. python通过多线程并获取返回值

    以下是多线程获取返回值的一种实现方式 # -*-coding:utf-8-*- from time import ctime, sleep import threading import numpy ...

  4. Java 的核心目的和并发编程

    读一本书,最好能从它的前言开始.那么我们就来看看<Java编程思想>作者 Bruce Eckel 在前言里都说了些什么吧. 01.Java 的核心目的是"为程序员减少复杂性&qu ...

  5. Python 调用 Hprose接口、Dubbo接口、Java方法

    #!/usr/bin/env python # -*- coding:utf-8 -*- # ************************************* # @Time : 2019/ ...

  6. Cypress安装使用(E2E测试框架)

    一.简介 Cypress是为现代网络打造的下一代前端测试工具,解决了开发人员和QA工程师在测试现代应用程序时面临的关键难点问题. Cypress包含免费的.开源的.可本地安装的Test Runner  ...

  7. Netty实战:设计一个IM框架

    来源:逅弈逐码 bitchat 是一个基于 Netty 的 IM 即时通讯框架 项目地址:https://github.com/all4you/bitchat 快速开始 bitchat-example ...

  8. Android 在Fragment中修改Activity中的控件

    在当前的Fragment中调用getActivity方法获取依附着的那个Activity,然后再用获取到的Activity去findViewById拿到你需要的控件对其操作就行了.

  9. 墙上你APP设计与实现

    墙上你APP,听名字你们就应该可以想到是一个类似于表白墙吧,其实在做这个项目的时候我就是看到我们学校有一个专门工程墙,但是你找它发布消息表白或者找寻自己在学校掉了的饭卡或者身份证的时候,需要等它们同意 ...

  10. Ubuntu Server中怎样卸载keepalived

    场景 在Ubuntu Server中进行安装keepalived ,如果安装过程中出现纰漏,想要重新安装keepalived或者就是想直接卸载keepalived. 我们在安装keepalived时指 ...