.net中用Action等委托向外传递参数

原文:.net中用Action等委托向外传递参数

     一般我们可以使用ref,out达到向外传递参数目的。 Action<T>是一个特殊的委托,除了常规应用。我们还可以用它来实现简单地向外传递参数。直接看下面的UnitTest代码:

   1: [TestMethod]
   2: public void PassOutParametersUsingDelegate()
   3: {
   4:     int i = 0;
   5:     string messgae = string.Empty;
   6:     int? addedNumber = 1;
   7:  
   8:     //It is pass parameter by Action<T1,T2>
   9:     Foo1((a, b) =>
  10:     {
  11:         i = a;
  12:         messgae = b;
  13:     });
  14:  
  15:     //It is pass parameter by Func<T1,T2,TResult>
  16:     Foo2((a, b) =>
  17:     {
  18:         i = a;
  19:         messgae = b;
  20:         return addedNumber;
  21:     });
  22:  
  23:     Foo2((a, b) =>
  24:     {
  25:         return a+100;
  26:     });
  27:  
  28:     Assert.AreEqual("i=15,message=fifteen", string.Format("i={0},message={1}", i, messgae));
  29:  
  30:  
  31: }
  32:  
  33: private void Foo1(Action<int, string> action)
  34: {
  35:     int number = 15;
  36:     string msg = "fifteen";
  37:  
  38:     action(number, msg);
  39: }
  40:  
  41: private void Foo2(Func<int, string, int?> func)
  42: {
  43:     int number = 15;
  44:     string msg = "fifteen";
  45:  
  46:     int? tempInt = func(number, msg);
  47: } 

上面的代码我们演示使用Action<T>, 有注意到我们把a,b两个值传递给方法外面的变量。同样的,我们用Func<TResult>可以实现。为什么会有这样的代码产生呢?源于这样的场景,有一个方法只有一个输入参数,返回void 。我们为了不改变原来这个方法参数签名,增加新的子方法,使用Action<T>向外传递参数。然后再用原方法Wrap新的子方法。

    关于Action<T>还有很多精彩的运用,Builder模式与Fluent接口

    希望对您开发有帮助。

作者:Petter Liu

出处:http://www.cnblogs.com/wintersun/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

该文章也同时发布在我的独立博客中-Petter Liu Blog

时间: 2024-10-23 04:41:34

.net中用Action等委托向外传递参数的相关文章

ajax-ssh 零配置 采用juery+Ajax如何传递参数到action实现登录功能验证?

问题描述 ssh 零配置 采用juery+Ajax如何传递参数到action实现登录功能验证? ajax应该如何判断逻辑,以及执行action时return应如何处理? 解决方案 首先你登陆的用户名.密码获取之后传到Action,在Action把获取的参数用户名到数据库查询,如果没有提示,有的话返回结果,取出密码比较和前台获取的可以一样.相同就可以登录.否则提示. 解决方案二: ajax success的时候获取返回值 通过后台返回值判断是否登录成功 例如ajax传账号密码到后台.后台执行sql

QTP多个Action之间传递参数的方法详解

 点击打开链接 脚本的朋友们都会碰到多个Action之间传递参数的问题,想当年我也是研究了好久才成功的,网上虽然有很多文章都在讲这个问题,但是大多都是雷同的抄来抄去不能解决实际问题,也有可能是我太笨了吧.下面我们来详细讲一下QTP多个Action之间传递参数的方法. 一.假设Action1调用Action2并且Action1传递参数给Action2 1.Action1的代码及设置 '定义两个变量 Dim strMessA:strMessA = "我是" Dim strMessB:str

Android应用开发(三):如何完成Activity之间的传递参数

本文介绍如何在Activity之间传递参数,该参数包括简单数据.包Bundle(提供2种方法,即有和无Bundle的两种方法).值对象(提供2种方法,即Serializable和Parcelable的两种方法),最后介绍如何获取Activity的返回参数.以上所介绍的内容都提供了操作步骤和源码以便于大家交流与分享心得.   1.在Activity之间传递简单数据 (1).新建Button 在activity_main.xml中加入如下代码: <Button android:layout_widt

完美解决js传递参数中加号和&amp;号自动改变的方法_javascript技巧

在action中用get方法获得参数,如果参数里有"+",要做处理,否则到后台会变成空格. 解决方案: 1 .改用post方法: 2 .在 js 里用 url = encodeURI(encodeURI(XXX)) ,后台再解码一次: 3 .传递参数的时候直接替换转义,或者直接写转义后的代码 data =  "a + b": data = data.replace(/\+/g, "+"); data = data.replace(/\&/

页面之间传递参数的几种方法

Asp.net页面之间传递参数的几种方法 第一种方法:通过URL链接地址传递     send.aspx:      protected void Button1_Click(object sender, EventArgs e)     {              Request.Redirect("Default2.aspx?username=honge");    }    receive.aspx:    string username = Request.QueryStri

php- js在不跳转的情况下向一个页面传递参数

问题描述 js在不跳转的情况下向一个页面传递参数 需求是把textarea传递到savexml.php进行数据保存,但同时我希望页面还留着当前页面.代码如下: <form name=""form1"" id=""form1"" method=""post"" action=""newtest.php""> <input type=

如何在调用线程的时候传递参数

我们在写Remoting程序或者其他的一些应用程序的时候难免要和线程打交道,.Net使我们很容易就可以创建一个线程,但是它提供的创建线程和启动线程的方法没有明显的提供参数,假如我们要用线程来启动类里面一个带参数的方法该怎么办?下面就简单的介绍如何使用.NET提供的丰富的框架来实现这个功能.为了可以生动详细的介绍整个过程,我建立下面的一个.NET类,它也是要用线程启动的方法的载体.类如下所示: using System; namespace WindowsApplication1 {       

在ASP.NET里通过URL传递参数得到乱码的解决方法

asp.net|解决 昨日试写ASP.NET程序,其中用Get方法传递参数,如:http://127.0.0.1/showerror,asp?ErrorMessage=数据库出错啦 在程序中我用:string ErrorMessage=Request.QueryString["ErrorMessage"];Response.Write(ErrorMessage); 结果在页面上得到的是空白,我修改了aspx文件的meta部分,把字符集改成gb2312,结果页面上出现乱码. 后来在csd

c#中通过值和引用传递参数(downmoon)

c#中通过值和引用传递参数(downmoon)在 C# 中,既可以通过值也可以通过引用传递参数.通过引用传递参数允许函数成员(方法.属性.索引器.运算符和构造函数)更改参数的值,并保持该更改.若要通过引用传递参数,请使用 ref 或 out 关键字.为简单起见,本主题的示例中只使用了 ref 关键字.有关 ref 和 out 之间的差异的信息,请参见.使用 ref 和 out 传递数组. 本主题包括下列章节: 传递值类型参数 传递引用类型参数它还包括以下示例: 示例 演示 是否使用 ref 或