Tag: 委托

帮助理解.NET委托,事件和事件处理程序

在过去的几天里,我在这里和这里问了几个关于代表的问题。 我承认……我真的不了解代表们。 我真的非常想要理解并掌握它们。 (我可以定义它们 – 键入安全函数指针 – 但由于我对C类型语言没什么经验,所以它并没有用。) 任何人都可以推荐一些能以某种方式解释代表的在线资源吗? 这是我怀疑VB实际上让我失望的那一刻,因为它在幕后为我做了一些布线。 理想的资源只是解释代表是什么,而不参考任何其他类似的东西(事件和事件处理程序),会告诉我所有的东西是如何连线的,解释(正如我刚才所知)委托是类型,是什么使它们作为一个独特的类型(也许使用一点ildasm魔法))。 然后,该基础将扩展,以解释代表如何与事件和事件处理程序相关,这些事件和事件处理程序本身需要一个很好的解释。 最后,这个资源可以使用真实示例将它们联系在一起,并解释编译器自动发生的连接,如何使用它们等等。哦,是的,当你应该而且不应该使用代理时,换句话说,缺点和替代方案使用代表。 你说什么? 你们中的任何人都可以向我指出可以帮助我开始掌握之旅的资源吗? 编辑最后一件事。 理想的资源将解释如何在接口声明中使用委托。 这真是让我失望的事情。 谢谢你的帮助。 赛斯

C#无法将方法转换为非委托类型

我有一个名为Pin的课程。 public class Pin { private string title; public Pin() { } public setTitle(string title) { this.title = title; } public String getTitle() { return title; } } 从另一个类我在List引脚中添加Pins对象,从另一个类中我想迭代List引脚并获取元素。 所以我有这个代码。 foreach (Pin obj in ClassListPin.pins) { string t = obj.getTitle; } 使用此代码,我无法检索标题。 为什么? (注意: ClassListPin只是一个包含一些元素的静态类,其中一个是List引脚)

将此委托转换为匿名方法或lambda

我是所有匿名function的新手,需要一些帮助。 我得到以下工作: public void FakeSaveWithMessage(Transaction t) { t.Message = “I drink goats blood”; } public delegate void FakeSave(Transaction t); public void SampleTestFunction() { Expect.Call(delegate { _dao.Save(t); }).Do(new FakeSave(FakeSaveWithMessage)); } 但这完全是丑陋的,我想让Do的内部成为匿名方法,如果可能的话,甚至是lambda。 我试过了: Expect.Call(delegate { _dao.Save(t); }).Do(delegate(Transaction t2) { t2.Message = “I drink goats blood”; }); 和 Expect.Call(delegate { _dao.Save(t); }).Do(delegate { t.Message = “I drink goats […]

避免在C#中重复的事件订阅

您如何建议避免重复事件订阅的最佳方法? 如果这行代码在两个地方执行,则事件将运行两次。 我试图避免第三方事件订阅两次。 theOBject.TheEvent += RunMyCode; 在我的委托制定者中,我可以有效地运行这个…… theOBject.TheEvent -= RunMyCode; theOBject.TheEvent += RunMyCode; 但这是最好的方法吗?

为什么从表达式<Func >创建的Func 比直接声明的Func 慢?

为什么通过.Compile()从Expression<Func>创建的Func比使用直接声明的Func慢得多? 我刚刚使用Func直接声明为在我正在处理的应用程序中使用Expression<Func>创建的Expression<Func> ,我注意到性能下降了。 我刚做了一点测试,从Expression创建的Func占用了Func直接声明的时间的“几乎”。 在我的机器上,Direct Func大约需要7.5秒,而Expression<Func>大约需要12.6秒。 这是我使用的测试代码(运行Net 4.0) // Direct Func test1 = x => new Foo(x * 2); int counter1 = 0; Stopwatch s1 = new Stopwatch(); s1.Start(); for (int i = 0; i < 300000000; i++) { counter1 += test1(i).Value; } s1.Stop(); var result1 = s1.Elapsed; // Expression . Compile() Expression<Func> expression = […]

代理上的可选参数无法正常工作

为什么这段代码不能编译? delegate int xxx(bool x = true); xxx test = f; int f() { return 4; }

可以使用预定义参数将方法附加到委托吗?

有时我会遇到需要将方法附加到委托但签名不匹配的情况,例如尝试将abc附加到somedelegate,字符串参数为“hi”。 public class test { //… public void abc(int i, string x) { //Do Something } //… } public class test2 { somedelegate x; //… public test2() { //Do Something test y = new test(); x += y.abc(,”hi”); } delegate void somedelegate(int i); } 我可以通过创建具有正确签名的另一个委托然后附加它来解决它,但它似乎不必要地复杂。 你能用C#做这样的事吗? 谢谢。 对。 我想我没有办法按照我的设想去做,但我仍然可以像x + =(int i)=> abc(i,“hi”);那样做。 所以现在没问题,谢谢你们。

C#委托与lambda表达式的反演

下面的第二个测试方法不编译(不能将lambda表达式转换为目标类型D1 )。 这是否意味着(非generics)委托契约不适用于lambda表达式? [TestFixture] public class MyVarianceTests { private abstract class Animal {} private class Tiger : Animal {} private delegate Type D1(Tiger tiger); private static Type M1(Animal animal) { return animal.GetType(); } [Test] public void ContravariantDelegateWithMethod() { D1 func = M1; Type result = func(new Tiger()); Assert.AreEqual(result, typeof (Tiger)); } [Test] public void ContravariantDelegateWithLambda() […]

如何将多个方法(带参数)作为参数传递?

假设我有以下WCF代码: try { ServiceClient proxy = new ServiceClient(); proxy.ClientCredentials.UserName.UserName = “user”; proxy.ClientCredentials.UserName.Password = “password”; proxy.GetData(2); if (proxy.State = CommunicationState.Opened) { proxy.GetData(“data”); } proxy.Close(); } catch (FaultException ex) { // handle the exception } 而且由于我注意到try … catch和其他逻辑是重复的,更不用说设置WCF调用是昂贵的,我想向这个函数发送许多“方法和参数”。 实质上将GetData(2)和GetData(“data”)作为方法数组传递,并使结果异步或同步返回。 我怎么做到这一点? 我想我可以有两个’ref’对象来处理结果[]和对结果[]的共享锁。 但是我不确定如何将“带参数的方法”作为参数传递给另一个函数。 也许另一种看待它的方法可能是一个函数指针数组,使用不同的参数来表示相同的函数。 任何人都可以推动我做正确的方法吗? 更多信息: 我问这个问题所以我可以优化这种方法来处理WCFexception和重试,但所以我不必总是在每次调用后打开/关闭客户端。

检索在Func中执行的调用方法的名称

我想获得被委派为Func的方法的名称。 Func func = x => x.DoSomeMethod(); string name = ExtractMethodName(func); // should equal “DoSomeMethod” 我怎样才能做到这一点? – 吹牛的权利 – Make ExtractMethodName也可以使用属性调用,让它返回该实例中的属性名称。 例如。 Func func = x => x.Property; string name = ExtractMethodName(func); // should equal “Property”