在c#委托中,经常可能遇到函数重载的情况,可是又需要在一个函数中调用这些函数,一般我都是根据多个函数重载个数,也写上这么多个函数重载。比如

public double T1(int r)
{
return r;
}
public double T2(double n1, double n2)
{
return n1 + n2;
}

现在呢,我需要写另外一个函数,这个函数第一个参数就是委托类型,我想让他既可以代表T1,也可以代表T2,但是一般是无法这样做的,因此我们只能写两个函数

        public void DT1(Func<double,int> fun,double r)
{
Console.WriteLine("这是T1方法得到的结果:{0}",fun(r));
}
public void DT1(Func<double,double,double>fun, double n1,double n2)
{
Console.WriteLine("这是T1方法得到的结果:{0}", fun(n1,n2));
}

当函数少的时候这样写还可以,一旦多了呢,或者根本不知道要传哪种类型的委托,这时候该怎么办,我们想到了多态,也就是传一个委托的父类,参数声明为object类型,比如:

        public void T(Delegate d,object[] pms)
{
}

但是,这样该如何调用呢,我们首先想到那我能不能直接d(pms)呢, 答案肯定是不行的,如果你这样做,编译器就会提示:”“d”是“变量”,但此处被当做“方法”来使用”,为什么会出现这种情况,我们转到这个类的定义查看,发现Delegate是一个abstract 类,也就是只有在执行的过程中,CLR才会知道到底是d代表的是哪种委托,所以就无法这样做了~~。然后我们想到了反射,是不是可以利用反射呢。果然,这个类下面有一个属性 public MethodInfo Method { get; } 这个属性是一个MethodInfo类型的。于是我们这样改一下代码:

public void T(Delegate d,object[] pms)
{
//d(pms);
double r = ;
System.Reflection.MethodInfo method = d.Method;
r=(double)method.Invoke(this, pms);
Console.WriteLine("Invoke得到的结果:{0}",r);
}

invoke中的第一个参数是这个方法是哪个类的,如果是静态方法,则忽略此参数,第二个参数是一个object数组,代表了这个委托代表方法的参数,按顺序传递。Invoke方法的返回值就是执行方法的返回值,这里强转一下,就能得到结果。

static void Main(string[] args)
{
Test ct = new Test();
ct.T(new Func<int, double>(ct.T1), new object[] { });
ct.T(new Func<double, double, double>(ct.T2), new object[] { , });
Console.ReadKey();
}

执行结果为:

Invoke得到的结果:
Invoke得到的结果:

Delegate中还有一个方法,protected virtual object DynamicInvokeImpl(object[] args) 这是一个虚函数,和Invoke方法是一样的,只不过省略了第一个参数

        public void T(Delegate d,object[] pms)
{
//d(pms);
double r = ;
//System.Reflection.MethodInfo method = d.Method;
//r=(double)method.Invoke(this, pms);
r=(double)d.DynamicInvoke(pms);
Console.WriteLine("Invoke得到的结果:{0}",r);
}

这样也能达到同样的效果。

第一次写博客。。有的东西也是似懂非懂,还请各位大神见谅。。。

c#委托中另外一种用法的更多相关文章

  1. use关键字在PHP中的几种用法

    在学习了和使用了这么多年的PHP之后,您知道use这个关键字在PHP中都有哪些用法吗?今天我们就来看一下它的三种常见用法. 1. 用于命名空间的别名引用 // 命名空间 include 'namesp ...

  2. using关键字在C#中的3种用法

    using 关键字有两个主要用途:  (一).作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型.  (二).作为语句,用于定义一个范围,在此范围的末尾将释放对象. (一).作为指令 1. ...

  3. 浅谈[^>]在正则中的2种用法

    /^A/会匹配"An e"中的A,但是不会匹配"ab A"中的A,此时^A的意思是“匹配开头的A” /[^a-z\s]/会匹配"my 3 sister ...

  4. Java中super的几种用法并与this的区别

    1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位. class Base { Base() { System.out.println("Base"); ...

  5. C#中this的 四种 用法

    C#中的this用法,相信大家应该有用过,但你用过几种?以下是个人总结的this几种用法,欢迎大家拍砖,废话少说,直接列出用法及相关代码. this用法1:限定被相似的名称隐藏的成员 /// < ...

  6. js正则表达式中的问号几种用法小结

    这篇文章主要介绍了js正则表达式中的问号几种用法,比如+?,*?,{2,3}?可以停止匹配的贪婪模式,感兴趣的朋友可以参考下 在表示重复的字符后面加问号,比如+?,*?,{2,3}?可以停止匹配的贪婪 ...

  7. mysql中模糊查询的四种用法介绍

    下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] ...

  8. JSP中的include的两种用法

    1.两种用法 <%@ include file=” ”%> <jsp:include page=” ” flush=”true”/> 2.用法区别 (1)执行时间上区别 < ...

  9. ASP.NET MVC中Area的另一种用法

    ASP.NET MVC中Area的另一种用法 [摘要]本文只是为一行代码而分享 context.MapRoute("API", "api/{controller}/{ac ...

随机推荐

  1. 疯狂学习java web2(css)

    CSS应该是样式描述的意思,定义如下: 什么是 CSS? CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素 样式通常存储在样式表中 把样式添加到 ...

  2. nodejs 初学笔记

    首先到nodejs的官网安装nodejs,地址nodejs.org,网站第一页会根据你的电脑系统推荐你适合的版本,下载,不断next,在cmd中输入 node -v 可以看到版本的话,即安装成功. 说 ...

  3. 【行为型】Visitor模式

    访问者模式意图在不改变目标对象类结构的情况下,扩展对象类的行为.新扩展的行为均被封装成类对象的形式来动作.应用该模式时,往往目标类系与Visitor类系是两个不同的类系,它们配合工作但维护是分开的,互 ...

  4. C语言基础学习运算符-赋值运算符

    简单赋值 在C语言里,运算符=并不表示相等,而是一个赋值运算符.这意味着,符号=的左边该是一个可修改的变量名,而右边是赋给该变量的值. 如下程序语句: i = i+; 在数学上,该等式无法成立.而作为 ...

  5. js监听回车事件

    标题通俗的说,也就是绑定当用户按下回车键要执行的事件. 下面,入正题. 第一步,先编写简单的页面代码,这里我们只需要一个按钮就足够了.当然,还有按钮事件. <html> <head& ...

  6. Spark On YARN内存分配

    本文转自:http://blog.javachen.com/2015/06/09/memory-in-spark-on-yarn.html?utm_source=tuicool 此文解决了Spark ...

  7. Jackson将json字符串转换成List<JavaBean>

    Jackson处理一般的JavaBean和Json之间的转换只要使用ObjectMapper 对象的readValue和writeValueAsString两个方法就能实现.但是如果要转换复杂类型Co ...

  8. JDBC与javaBean

    1.JDBC的概念: Java数据库连接技术(Java DataBase Connectivity)能实现java程序对各种数据库的访问, 由一组使用java语言编写的类 和 接口(jdbc api) ...

  9. Solr4.8.0源码分析(8)之Lucene的索引文件(1)

    Solr4.8.0源码分析(8)之Lucene的索引文件(1) 题记:最近有幸看到觉先大神的Lucene的博客,感觉自己之前学习的以及工作的太为肤浅,所以决定先跟随觉先大神的博客学习下Lucene的原 ...

  10. 转:Google论文之一----Bigtable学习翻译

    文章来自于:http://www.cnblogs.com/geekma/archive/2013/05/30/3108391.html Bigtable研究 摘要 Bigtable是一个用于管理结构型 ...