Tag: 委托

在Monotouch中编译lambdas并在设备上调用委托

我目前正在MonoTouch中移植.NET代码库,我目前正在研究一种接收Expression 。 我正在尝试编译它,然后动态调用它。 这是我做的: // Here’s an example of what I could receive Expression<Action> expression = (a => Console.WriteLine (a * 2)); // And here’s what I’m trying to do to invoke it expression.Compile().DynamicInvoke(6); 这在iOS模拟器中工作正常,结果“12”在我的控制台中打印。 但后来我在iPad上尝试了,我收到了以下exception。 Object reference not set to an instance of an object at System.Linq.jvm.Runner.CreateDelegate () at System.Linq.Expressions.LambdaExpression.Compile () at System.Linq.Expressions.Expression`1[System.Action`1[System.Int32]].Compile () […]

使用传递给方法的lambda表达式是否会降低entity framework查询的速度?

我有一个方法: public static void GetObjects() { using(MyContext context = new MyContext()) { var objects = context.Bars.Where(b => b.Prop1 != null) .Select(b => new MyObject{Prop = b.Prop1, Name = b.Name}) .ToList(); foreach(var object in objects) { // do something with the object } } } 我重构了方法,使其更通用,以便我可以传入一个Func以便我可以指定where语句和Bars表中的哪些属性被分配给MyObject.Prop如下所示: public static void GetObjectsV2(Func whereFunc, Func selectPropFunc) { using(MyContext context […]

是否存在委托语法优先于匿名方法的lambda表达式的情况?

随着lambda表达式(内联代码)等新function的出现,它是否意味着我们不再需要使用委托或匿名方法了? 在我看过的几乎所有样本中,都是使用新语法进行重写。 我们仍然需要使用delegates和lambda表达式的任何地方都不起作用?

Action和Func参数的歧义

这段代码怎么可能 TaskManager.RunSynchronously(fileMananager.BackupItems, package); 导致编译错误 The call is ambiguous between the following methods or properties: ‘TaskManager.RunSynchronously(System.Action, MyObject)’ and ‘TaskManager.RunSynchronously(System.Func, MyObject)’ 当行动的签名是 public void BackupItems(MyObject package) 和“暧昧”的方法是 static class TaskManager { public static void RunSynchronously(Action task, TInput param) { Task.Factory.StartNew(() => task(param)); } public static bool RunSynchronously(Func task, TInput param) { return Task.Factory.StartNew(() => task(param)).Result; } } […]

如何在C#中基于现有的委托类型创建新的委托类型?

有没有办法可以根据现有的委托类型创建新的委托类型? 在我的例子中,我想创建一个委托MyMouseEventDelegate ,它具有与EventHandler相同的function。 我为什么要这个? 当然,要利用编译时类型检查 ! 这样,我可以有两个不同的委托: MyRightClickHandler和MyLeftClickHandler ,并且永远不会混淆twain – 即使它们在function上与EventHandler相同。 是否有语法来做这种事情? 哦,代码如下: using MyRightClickHandler = EventHandler 不够好。 它不进行任何类型检查,因为它实际上不会创建新类型。 而且我必须将这样的一行粘贴到我将引用MyRightClickHandler每个代码文件中。

为什么编译器在没有闭包时为委托添加额外的参数?

我正在与delegates一起玩,并注意到当我创建一个Func如下例所示: Func func1 = (x, y) => x * y; 编译器生成的方法的签名不是我所期望的: 正如您所看到的,它需要一个对象作为它的第一个参数。 但是当有一个关闭时: int z = 10; Func func1 = (x, y) => x * y * z; 一切都按预期工作: 这是带有额外参数的方法的IL代码: .method private hidebysig static int32 ‘b__0′(object A_0, int32 x, int32 y) cil managed { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) […]

使用BackgroundWorker更新UI而不冻结……?

我有以下代码用于从后台线程填充ListView(DoWork调用PopulateThread方法): delegate void PopulateThreadCallBack(DoWorkEventArgs e); private void PopulateThread(DoWorkEventArgs e) { if (this.InvokeRequired) { PopulateThreadCallBack d = new PopulateThreadCallBack(this.PopulateThread); this.Invoke(d, new object[] { e }); } else { // Ensure there is some data if (this.DataCollection == null) { return; } this.Hide(); // Filter the collection based on the filters List resultCollection = this.ApplyFilter(); // Get […]

委托实例和方法指针之间有什么区别?

我认为委托实例可以与函数实例互换。 请使用以下代码: delegate int AddDelegate(int a, int b); AddDelegate DelegateInstance; public void DoStuff() { //I can call this without a delegate “instance”: MethodThatTakesAdd(Add); //I can also call it WITH a delegate “instance” DelegateInstance = Add; MethodThatTakesAdd(DelegateInstance); } public int Add(int a, int b) { return a + b; } public void MethodThatTakesAdd(AddDelegate addFunction) { Console.WriteLine(addFunction(1, […]

为C#中的所有事件和委托创建一个catch-all处理程序

我想创建一个可用于处理任何事件或委托的处理程序。 具体来说,我希望能够编写如下代码: class Invoker { public object Invoke(object[] arg) { // generic handling code } } static void Main() { var p = new Person(); p.AddHandler(“Event1”, new Invoker().Invoke); } AddHandler是object的扩展方法,它接收事件名称和类型为Func的委托。 它应该能够做任何魔术来将事件(例如,在这种情况下为Event1 )绑定到提供的委托,以便在触发事件时调用委托。 Event1的签名无关紧要,因为AddHandler应该适用于所有类型的事件(和委托)。 我怀疑这可能涉及一些CIL生成来构建匹配指定事件类型的动态委托(例如Event1 )并将调用转发给指定的委托(例如new Invoker().Invoke )。 我能够构建这样一个动态委托,但它只能转发到静态方法,而不是实例方法,因为我找不到将待调用方法的绑定实例推送到CLR堆栈的方法(即示例中的Invoker实例)。 请参阅下面提供的代码以清楚地查看此问题(请参阅标有ISSUE的行)。 如果有人能指出一种方法来改进动态生成代码以捕获绑定对象或更好,建议一个更简单的解决方案,不需要CIL然后非常感激。 public static void AddHandler(this object target, string fieldName, Func func) { var eventInfo = target.GetType().GetEvent(fieldName); […]

重播function和参数列表

我有一系列function,我想拥有以下function。 调用该函数时,将其自身添加到记住参数和值的函数列表中 允许在以后调用函数列表 不同的function有各种不同的参数,我很难想到一个优雅的方法来做到这一点。 任何帮助,将不胜感激。