Tag: 委托

为什么`Predicate `与`Func `不匹配?

我尝试在C#中编译以下代码: public static T FirstEffective(IEnumerable list) { Predicate pred = x => x != null; return Enumerable.FirstOrDefault(list, pred); } 编译器(Mono / .NET 4.0)给出以下错误: File.cs(139,47) The best overloaded method match for `System.Linq.Enumerable.FirstOrDefault(this System.Collections.Generic.IEnumerable,System.Func)’ has some invalid arguments /usr/lib/mono/4.0/System.Core.dll (Location of the symbol related to previous error) File.cs(139,47): error CS1503: Argument `#2′ cannot convert `System.Predicate’ expression to […]

如何确定某个特定代表是否已分配给某个活动?

我在winform上有一个命令按钮。 所以,如果我有类似的东西: myButton.Click += MyHandler1; myButton.Click += MyHandler2; myButton.Click += MyHandler3; 如何判断是否已将任何特定的MyHandler添加到Click事件中,以便它不会再添加到我的代码中的其他位置? 我已经阅读了如何使用GetInvocationList()来获取自己的事件信息。 但是在尝试使用各种组合获取命令按钮的项目时出错。 它说, “事件’System.Windows.Forms.Control.Click’只能出现在+ =或 – =的左侧。” 我错过了什么? [编辑] – 我想强调艾哈迈德指出的这个问题 。 这是一个kludge,应该更容易恕我直言,但看起来它可能只是工作。

Task.Run和预期的委托

我不确定如何从以下观察结果中理解。 var f = new Func(uc.ViewModel.SlowProcess); 1) (VALID) string dataPromise = await Task.Run(() => f(token), token); 2) (VALID) string dataPromise = await Task.Run(() => uc.ViewModel.SlowProcess(token), token); 3) (ERROR) string dataPromise = await Task.Run(f(token), token); uc.ViewModel.SlowProcess是一个将CancellationToken作为参数并返回字符串的方法。 项目1)和2)有效且工作正常。 第3项无效,给出以下错误: 错误1’System.Threading.Tasks.Task.Run(System.Func>,System.Threading.CancellationToken)’的最佳重载方法匹配有一些无效的参数 错误2参数1:无法从’string’转换为’System.Func>’ 为什么我不能将f(令牌)作为代理传递? 如果我使用不带参数的方法,它也可以。

使用Action 多个参数创建任务

我想在包含Action的Task中添加多个参数。 我回顾了现有的堆栈溢出问题使用Action 创建任务 请帮助我如何在任务中的Action方法中传递多个参数 Action action = (string msg, int count) => { Task.Factory.StartNew(async () => { await LoadAsync(msg, count); }); }; Task task = new Task(action, ….); 行动方法是 public static async Task LoadAsync(string message, int count) { await Task.Run(() => { Thread.Sleep(1500); }); Console.WriteLine(“{0} {1} Exceuted Successfully !”, message ?? string.Empty, (count == 0) […]

你可以将一个委托的结果链接到C#中另一个委托的输入吗?

我正在寻找一种链接几个代表的方法,所以一个代表的结果成为下一个代表的输入。 我试图在方程求解程序中使用它,其中部分通过不同的方法完成。 这个想法是,当你构建方程式时,程序会添加代理并按特定顺序链接它们,因此可以正确解决。 如果有更好的方法来解决问题,请分享。

字典与不同类型的代理:清除,非字符串方法名称?

必须有一个更清洁的方法。 目前我有: … Constructor() { parseDictionary = new Dictionary() { {typeOfStream.SOME_ENUM_VAL, Delegate.CreateDelegate(typeof(ParseDelegate), this, “MyMethod”)}, {typeOfStream.SOME_OTHER_ENUM_VAL, Delegate.CreateDelegate(typeof(ParseDelegate), this, “MyOtherMethod”)} }; } public bool MyMethod(string some_string) { … } public bool MyOtherMethod(XmlNode some_node) { … } 我想摆脱“MyMethod”和MyOtherMethod并将它变成这个.MyMethod和this.MyOtherMethod 。 选项? 我对任何允许我使用Dictionary查找的解决方案持开放态度,并将我的数据mojo指向任意方法(以及具有任意一组参数的已定义方法)以进行解析。

无法为委托分配具有较少特定参数类型的匿名方法

public class Program { delegate void Srini(string param); static void Main(string[] args) { Srini sr = new Srini(PrintHello1); sr += new Srini(PrintHello2); //case 2: sr += new Srini(delegate(string o) { Console.WriteLine(o); }); sr += new Srini(delegate(object o) { Console.WriteLine(o.ToString()); }); //case 4: sr += new Srini(delegate { Console.WriteLine(“This line is accepted,though the method signature is […]

将委托定义为函数指针

我正在使用一个调用非托管函数指针的委托。 这会导致垃圾收集器在使用之前收集它,如MSDN上的CallbackOnCollectedDelegate MDA页面中所述:CallbackOnCollectedDelegate MDA的MSDN页面 。 该决议声明我必须将适当的委托编组为非托管函数指针。 我最初的反应是使用: [MarshalAs(UnmanagedType.FunctionPtr)] public delegate void EntityCallback([MarshalAs(UnmanagedType.SysInt)] IntPtr entity); 但是,C#编译器不会让我编组委托,即使这是MSDN建议的解决方案。 此外,MSDN页面仅显示抛出问题的示例,但不是解决方案之一。 我怎么能将我的委托编组为一个非托管函数指针或阻止它被GCed? 编辑 :根据建议,我创建了回调的引用。 因此,我的代码从/更改为: // From: foo.SetCallback(new EntityCallback(bar)); // To: call = new EntityCallback(bar); // Referenced in class foo.SetCallback(call); 现在这确实有效 – 但仅限于调试模式。 当我切换到Release时,它会在同一点崩溃。 这是为什么? 编辑2 :更完整的代码片段: public class Test { private EntityCallback Call; private void Bar(System.IntPtr target) { … […]

从非静态方法构建静态委托

我需要创建一个类的非静态方法的委托。 复杂的是,在创建时我没有对类的重要性,只有它的类定义。 在通话时我确实有实例。 因此,我需要一种方法: 为成员方法构建一个“不完整”的委托,缺少实例。 从1中调用委托明确地传递该类的内容。 这些都可能吗? 怎么样? 注意:我愿意为第一名支付高性能价格,但理想情况下2不应该比委托电话贵很多。

代表,Lambdas,Action,Func,匿名函数

我只想validation我对以下内容的理解 委托 – 方法签名 Lambdas – 匿名函数 匿名函数 – 就是这样 操作 – 不返回任何内容的匿名函数 Func – 一个返回某些东西的匿名函数 嗯…他们都做类似的事情,你如何定义和知道何时使用每个? 对不起,我不好解释