Tag: 委托

在对象初始值设定项中分配事件

为什么不能在C#中的对象初始值设定项中分配事件和属性? 这样做似乎很自然。 var myObject = new MyClass() { Property = value, Event1 = actor, // or Event2 += actor }; 还是有一些我不知道的技巧?

C# – 如何“重载”代理?

首先,我正在阅读一些论坛和MSDN中的帮助,所有人都说代表不能超载。 现在,我希望有这样的事情: public delegate void OneDelegate(); public delegate void OneDelegate(params object[] a); public void DoNothing(params object[] a) {} public void DoSomething() { /* do something */ } private OneDelegate someFunction; someFunction = new OneDelegate(DoSomething); someFunction = new OneDelegate(DoNothing); 所以,就像你知道的那样,你不能这样做,因为OneDelegate只引用第一个而不是第二个。 但是,有没有办法做到这一点? 或类似的东西? PS1:我想拥有任意数量的OneDelegate声明,而不只是一两个声明。

C#中的可选委托

这是两个扩展方法重载的简单示例 public static class Extended { public static IEnumerable Even(this List numbers) { return numbers.Where(num=> num % 2 == 0); } public static IEnumerable Even(this List numbers, Predicate predicate) { return numbers.Where(num=> num % 2 == 0 && predicate(num)); } } 通过将委托设置为可选,我希望能够将它们合并为一个: public static class Extended { public static IEnumerable Even(this List numbers, Predicate predicate […]

C#委托实例化与仅传递方法参考

我有一个简单的问题:实例化C#委托与仅传递函数引用相比有什么好处? 我的意思是: 为什么: Thread t = new Thread(new ThreadStart(SomeObject.SomeMethod)); 当你能做到: Thread t = new Thread(SomeObject.SomeMethod); 两者都会按照我的经验编译和工作……我错过了什么?

在C#中动态生成委托类型

我们有一个要求,我们需要动态生成委托类型。 我们需要根据输入参数和输出生成委托。 输入和输出都是简单类型。 例如,我们需要生成 int Del(int, int, int, string) 和 int Del2(int, int, string, int) 任何关于如何开始这方面的指示都会非常有帮助。 我们需要解析表示为xml的表达式。 例如,我们将(a + b)表示为 A B 我们现在希望将其公开为Func 。 我们当然希望允许xml中的嵌套节点,例如: (a + b) + (a – b * (c – d))) 我们希望使用表达式树和Expression.Compile来做到这一点。 欢迎就这种方法的可行性提出建议。

lambda表达式的重点是什么?

阅读本文后 ,我无法弄清楚为什么使用lambda表达式。 公平地说,我认为我没有正确理解委托和表达式树类型是什么,但我不明白为什么有人会使用lambda表达式而不是声明的函数。 有人可以开导我吗?

为什么异步委托方法需要调用EndInvoke?

为什么委托需要在方法触发之前调用EndInvoke? 如果我需要调用EndInvoke(它阻塞线程)那么它真的不是异步调用吗? 这是我试图运行的代码。 class Program { private delegate void GenerateXmlDelegate(); static void Main(string[] args) { GenerateXmlDelegate worker = new GenerateXmlDelegate(GenerateMainXml); IAsyncResult result = worker.BeginInvoke(null, null); } private static void GenerateMainXml() { Thread.Sleep(10000); Console.WriteLine(“GenerateMainXml Called by delegate”); } }

C#:将对象添加到队列时触发事件

每当将对象添加到Queue时,我都需要能够触发事件。 我创建了一个扩展Queue的新类: public delegate void ChangedEventHandler(object sender, EventArgs e); public class QueueWithChange : Queue { public event ChangedEventHandler Changed; protected virtual void OnChanged(EventArgs e) { if (Changed != null) { Changed(this, e); } } } 然后从另一个类附加事件,如: QueueWithChange eventQueue = new QueueWithChange(); // eventQueue.Changed += new ChangedEventHandler(delegate(object s, EventArgs ex) { //This event is not being […]

如何将事件传递给方法?

我想创建一个方法,将事件作为参数,并向其添加eventHandler以正确处理它。 像这样: 我有两个事件: public event EventHandler Click; public event EventHandler Click2; 现在我想将一个特定事件传递给我的方法(伪代码): public AttachToHandleEvent(EventHandler MyEvent) { MyEvent += Item_Click; } private void Item_Click(object sender, EventArgs e) { MessageBox.Show(“lalala”); } ToolStripMenuItem tool = new ToolStripMenuItem(); AttachToHandleEvent(tool.Click); 可能吗? 我注意到这段代码工作正常,并返回到我的项目,并注意到当我传递在我的类中声明的事件时,它可以工作,但是当我从其他类传递事件时,它仍然无效。 我得到的是这个错误: 事件’System.Windows.Forms.ToolStripItem.Click’只能出现在+ =或 – =的左侧

如何使用reflection调用扩展方法?

我很感激之前已经提出了类似的问题,但我正在努力调用以下代码中的Linq Where方法。 我希望使用reflection动态调用此方法,并动态构建Where子句中使用的委托(或lambda)。 这是一个简短的代码示例,一旦工作,将有助于形成我正在构建的解释DSL的一部分。 干杯。 public static void CallWhereMethod() { List myObjects = new List(){new MyObject{Name=”Jon Simpson”}}; System.Delegate NameEquals = BuildEqFuncFor(“Name”, “Jon Simpson”); object[] atts = new object[1] ; atts[0] = NameEquals; var ret = typeof(List).InvokeMember(“Where”, BindingFlags.InvokeMethod, null, InstanceList,atts); } public static Func BuildEqFuncFor(string prop, object val) { return t => t.GetType().InvokeMember(prop,BindingFlags.GetProperty, null,t,null) == val; […]