Tag: 代表

如何获取委托调用的结果列表?

我需要更多地了解委托和C#语言设计。 假设我有一个MulticastDelegate ,它实现了通用委托,并包含多个调用: Func func = null; func += ( )=> return 8; func += () => return 16; func += () => return 32; 现在这段代码将返回32: int x = func(); // x=32 我想知道是否存在(或者更好,我应该问为什么它不存在!)使用C#语言特性可以访问所有委托调用的结果,这意味着获取列表({8 ,16,32})? 当然,使用.NET框架例程也可以这样做。 这样的事情会做的工作: public static List InvokeToList(this Func func) { var returnValue = new List(); if (func != null) { var invocations […]

委托实例方法不能为null’this’

我正在开发一个C#.NET 2.0应用程序,其中在运行时根据环境加载两个DLL中的一个。 两个DLL都包含相同的函数,但它们没有链接到相同的地址偏移量。 我的问题是关于我的应用程序代码中的函数委托。 public class MyClass { public delegate int MyFunctionDelegate(int _some, string _args); public MyFunctionDelegate MyFuncToCallFrmApp; public MyClass() : base() { this.MyFuncToCallFrmApp = new MyFunctionDelegate(this.MyFuncToCallFrmApp); // <– Exception thrown here. } public SomeFunction() { MyFuncToCallFrmApp(int _someOther, string _argsLocal); } } 当我的代码执行时,我得到一个ArgumentException “委托给一个实例方法不能为”’。” 我究竟做错了什么?

无法将lambda表达式转换为类型“object”,因为它不是委托类型

我有一个具有bool属性的基类,如下所示: public abstract class MyBaseClass { public bool InProgress { get; protected set; } } 我从它inheritance了另一个类,并尝试将InProgress添加为字典的委托。 但它给我一个错误。 这就是我的Derived类的样子: public abstract class MyClass { Dictionary dict = new Dictionary(); dict.Add(“InProgress”, InProgress => base.InProgress = InProgress); } 这是我得到的错误: 无法将lambda表达式转换为类型“object”,因为它不是委托类型 我在这做错了什么?

避免多种类似方法中的重复代码(C#)

大家问候! 我在C#中有一些非常类似的方法(可能会有几十个)。 它们都建立在几乎相同的模式上: ResultObjectType MethodX(…input parameters of various types…) { nesting preparation code here… { { resultObject = ExternalClass.GetResultForMethodX(input parameters of MethodX); } } nesting result processing code here … return resultObject; } 重复/相同的部分: ResultObjectType,准备代码,结果处理代码 。 不同部分: 调用ExternalClass方法,输入参数集(输入参数数量,类型)。 重要提示:我无法控制方法签名 – 无法更改它们。 我试图避免重复类似代码的所有块与这样的事情: ResultObjectType MethodX(…input parameters of various types…) { return UniversalMethod( new ExternalMethodDelegate(ExternalClass.GetResultForMethodX), input parameters […]

C#为什么我在订阅活动时会使用“new”关键字?

订阅以下两种订阅方式有什么区别? receiver.ConfigChanged += Config_ConfigChanged; receiver.ConfigChanged += new EventHandler(Config_ConfigChanged); 似乎它们都以相同的方式工作,但如果是这样,那么使用第二种方法有什么意义呢? 如果取消订阅,以下两种方法的工作方式是否相同? receiver.ConfigChanged -= Config_ConfigChanged; receiver.ConfigChanged -= new EventHandler(Config_ConfigChanged);

尝试调用委托时出现“方法不受支持”错误

我有一个函数Run(string, string[]) ,我想在一个单独的线程上运行,所以我使用委托和BeginInvoke : private Func<string, string[], Stack> runner; public MainPage() { runner = Run; } private void btnStep_Click(object sender, RoutedEventArgs e) { // snip runner.BeginInvoke(tbCode.Text, GetArgs(), null, null); // Exception here // snip } private Stack Run(string program, string[] args) { return interpreter.InterpretArgs(parser.Parse(lexer.Analyse(program)), args); } 但是,我得到NotSupportedException was unhandled by user code Specified method is […]

使用具有返回值的多个函数调用委托

我试图理解代表的概念,并得到一个查询。 假设我们将一个委托定义为返回类型为int,并接受int类型的2个参数。 代表声明: public delegate int BinaryOp(int x, int y); 现在,假设我们有2个方法(加法和乘法)都接受2个int参数并返回int结果。 码: static int Add(int x, int y) { return x + y; } static int Multiply(int x, int y) { return x * y; } 现在,当add和multiply方法被添加到此委托中时,然后当委托被调用时,如: BinaryOp b = new BinaryOp(Add); b+=new BinaryOp(Multiply); int value=delegate_name(2,3); 然后,根据我的理解,这两种方法都被调用。 现在,两个方法中的哪一个存储在值变量中? 或者它在这种情况下返回一个数组?

示例:使用.NET / C中的委托加速Reflection API#

正如本文中所提到的 ,我想出了一个使用Delegate加速.NET / C#中的Refection的示例。 但是,运行时出现此错误(编译工作正常)。 可能有什么问题? Unhandled Exception: System.ArgumentException: type is not a subclass of Multicastdelegate at System.Delegate.CreateDelegate (System.Type type, System.Object firstArgument, System.Reflection.MethodInfo method, Boolean throwOnBindFailure, Boolean allowClosed) [0x00000] in :0 at System.Delegate.CreateDelegate (System.Type type, System.Reflection.MethodInfo method, Boolean throwOnBindFailure) [0x00000] in :0 at System.Delegate.CreateDelegate (System.Type type, System.Reflection.MethodInfo method) [0x00000] in :0 at EX.RefTest.DelegateTest () [0x00000] […]

无法推断出Action 中的type参数,但是从Func 可以得到

我一直在玩仿制药和代表,我发现了一些我不理解的东西。 我有非常相似的通用静态方法,一个接受Action ,第二个接受Func 。 现在的问题是:如果我在没有显式类型的情况下调用接受Func那个,编译器就可以了。 但是接受Action无法编译我的程序(请参阅错误消息的代码)。 我的问题是:为什么编译器能够识别返回类型,但是无法识别参数类型? public interface IMessage { } public class Message : IMessage { } static void HandleAction(Action action) where TMessage : IMessage { } static void HandleFunction(Func action) where TMessage : IMessage { } static void A(Message message) { } static Message F() { return new Message(); } static void […]

WinForms从另一个表单中引发事件

我有一个名为MainForm的主窗体和一个名为ChildForm的子窗体我希望填充ChildForm的文本框,在MainForm_ButtonClick中我要激活ChildForm_ButtonClick事件。 ChildForm: public partial class ChildForm :Form { public delegate void delPassData(TextEdit text); private void button1_Click(object sender, EventArgs e) { string depart = “”; MainForm mfrm = new MainForm(); delPassData del = new delPassData(frm.funData); del(this.Item_CodeTextEdit); } } 的MainForm: public partial class MainForm : Form { public void funData(TextEdit txtForm1) { string ss = “”; ss […]