Tag: 委托

C#delegate vs eventHandler

我想在发生陷阱时向任何订户通知警报消息。 我通过委托方法(myDelegate del)制作的代码很好。 我的问题是…… 我想知道是否值得使用Eventhandler更好的代理? 在我的情况下,不确定委托和事件之间有什么不同? 通知(trapinfo t),这就是我在这里所做的,以获取陷阱信息。 但似乎不是一个好主意。 阅读一些介绍传递委托对象的在线教程课程,是否适合我的情况? 我该怎么办? 有什么建议? 非常感谢 :) 我的代码: public class trapinfo { public string info; public string ip; public string cause; } public class trap { public delegate void myDelegate(trapinfo t); public myDelegate del; trapinfo info = new trapinfo(); public void run() { //While(true) // If a trap […]

代表和谓词查询

我正在学习lambdas,而我正在努力理解为什么,同时拥有EmployeeFilterAge类,如下所示: public class EmployeeFilterAge { int _age; public EmployeeFilterAge(int age) { _age = age; } public bool OlderThan(Employee employee) { return employee._age > _age; } } 当我想要这样做时: var filterByAge = new EmployeeFilterAge(29); var del = new AgeExclusion(filterByAge.OlderThan); 我得到一个错误,说“没有重载方法…匹配委托…”,而委托看起来像这样: public delegate bool AgeExclusion(object person); 这是因为它是一个谓词吗?

委托和界面如何可以互换使用?

我可以使用接口方法而不是委托吗? 怎么样? 我发现搜索接口方法比使用委托更快。 我会很感激一个简单的代码片段。

委托人的构造函数和成员函数在何处定义?

当我在Reflector中查看Action委托时,我看到它有一个类似的构造函数 public Action(object @object, IntPtr method); 但我找不到任何相同的主体以及其他成员函数,如Invoke , BeginInvoke等。我只能看到它的定义。 这些function在哪里定义? 它们是否在.net BCL之外定义?

将C#语句体lambda转换为VB

看来VS8中的VB不支持/转换带有语句体的lambda表达式。 我在我的C#应用​​程序中使用它们,但现在必须将它转换为VB。 我正在动态创建一大堆控件,我希望能够动态地为它们提供事件处理程序。 这样我就可以从数据库构建动态用户界面。 在下面的代码中,我将创建一个表单和一个复选框,使复选框控制表单的可见性,向表单添加一些方法处理程序,然后将新创建的复选框添加到预先存在的表单/面板/等。 例如,表单的处理程序会影响复选框: // Inside some loop creating a lot of these forms and matching checkboxes Form frmTemp = frmTestPanels[i]; // New form in array CheckBox chkSelectPanel; // New checkbox that selects this panel chkSelectPanel = new CheckBox(); chkSelectPanel.Text = SomeName; // Give checkbox a label chkSelectPanel.Click += (ss, ee) => // […]

如何将事件处理程序委托转换为具有不同签名的委托

我写的代码实际上是一个WPF行为,用于从网格控件中获取所选项(SelectedItems,我们知道,它不是一个可绑定的属性)。 我实际上正在使用Telerik RadGridView但我希望行为对于任何具有SelectionChanged事件的内容都是通用的。 但是,不同的控件具有SelectionChanged事件处理程序的不同签名(RadGridView使用Telerik.Windows.Controls.SelectionChangeEventArgs而标准GridView使用System.Windows.Controls.SelectionChangedEventArgs)。 我们可以肯定的一件事是事件args将派生自EventArgs(实际上我们可以确定它将从RoutedEventArgs派生)。 但是,虽然我可以编写一个通用事件处理程序,它将RoutedEventArgs作为其第二个参数,并且我可以使用reflection来获取SelectionChangedEvent的EventInfo,但是我不能在不使用事件的精确签名的情况下将处理程序挂钩到事件handler – 在本例中是RadGridView处理程序。 这是我的代码。 我已经包含了所有内容,但重要的是SelectItemPropertyChanged,它是DependencyObject PropertyChangedCallback,它尝试将事件处理程序SelectionChangedHandler连接到SelectionChangedEvent。 (SelectionChangedHandler中的代码与问题无关,但我已经把它留在了,所以我很清楚我在做什么)。 public static class SelectedItemsChangedBehaviour{ public static readonly DependencyProperty SelectItemsProperty = DependencyProperty.RegisterAttached(“SelectItems”, typeof(bool), typeof(SelectedItemsChangedBehaviour), new FrameworkPropertyMetadata(false, new PropertyChangedCallback(SelectItemPropertyChanged))); public static void SetSelectItems(DependencyObject dependencyObject, bool selectItems) { dependencyObject.SetValue(SelectItemsProperty, selectItems); } public static bool GetSelectItems(DependencyObject dependencyObject) { return (bool)dependencyObject.GetValue(SelectItemsProperty); } private static void SelectItemPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs […]

c#:队列的入队事件

我是活动和代表的新手。 你能否指出我为Queue 类型的对象实现Enqueued事件的正确方向? 我正在使用C#和.Net 4.0 谢谢

有没有办法在变量中保存方法,然后再调用它? 如果我的方法返回不同类型怎么办?

编辑:谢谢你的答案。 我目前正在努力!! 我有3个方法,S()返回字符串,D()返回double,B()返回bool。 我还有一个变量来决定我使用哪种方法。 我想这样做: // I tried Func method; but it says D() and B() don’t return object. // Is there a way to use Delegate method; ? That gives me an eror saying method group is not type System.Delegate var method; var choice = “D”; if(choice==”D”) { method = D; } else if(choice==”B”) […]

在C#中组合多播委托 – 我应该使用运算符还是Action.Combine?

阅读文档我可以看到+运算符可用于组合/组合相同类型的委托。 以同样的方式,我可以看到我可以使用-运算符从组合委托中删除a。 我还注意到Action类型具有静态Combine和Remove方法,这些方法可用于连接两个委托的调用列表,并分别从另一个委托的调用列表中删除委托的最后一次出现的调用列表。 Action a = () => Debug.WriteLine(“Invoke a”); Action b = () => Debug.WriteLine(“Invoke b”); a += b; a.Invoke(); //Invoke a //Invoke b Action c = () => Debug.WriteLine(“Invoke c”); Action d = () => Debug.WriteLine(“Invoke d”); Action e = Action.Combine(c, d); e.Invoke(); //Invoke c //Invoke d a -= b; a.Invoke(); //Invoke a […]

代表们的GC,我错过了什么? (我的代表没有收集)

我有一个持有代表的类,以便稍后懒惰地评估一些东西。 一旦我评估了它,通过调用委托,我清除了对委托的引用,希望它有资格收集。 毕竟,如果将它构造为匿名方法,它可能会保留一个局部变量的世界。 我尝试构建一个unit testing来validation这一点,但它似乎没有按照我计划的方式解决,相反,似乎我对WeakReference (我在这里用于测试目的)的假设,或者其他一些假设,保持水。 看看这段代码,你可以在LINQPad中运行它 void Main() { WeakReference wr; Lazy l; CreateTestData(out wr, out l); wr.IsAlive.Dump(); // should be alive here GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); wr.IsAlive.Dump(); // and alive here as well l.Value.Dump(); // but now we clear the reference GC.Collect(); // so one of these should collect it GC.WaitForPendingFinalizers(); GC.Collect(); wr.IsAlive.Dump(); // […]