Tag: 代表

generics代表Parser 字典

我想创建一个解析器,它根据键将字符串标记转换为类型化对象。 我的第一个尝试,从Dictionary 借用不同类型代表的想法:Cleaner,非字符串方法名称? delegate T Parser(string item); public class TableParser { static IDictionary<string, Pair> _PARSERS; static Type DOMAIN_TYPE; static TableParser() { DOMAIN_TYPE= typeof(Domain); Dictionary<string, Pair> parsers = new Dictionary<string, Pair>() { { “PropertyOne”, new Pair( DOMAIN_TYPE.GetProperty(“PropertyOne”), (Parser) double.Parse ) }, }; _PARSERS = parsers; } public List Parse(string filename) { List domains = new List(); […]

C# – 使用任意数量的自定义参数进行委派

我想要一个代理,我可以将其存储在一个变量中供以后使用,该代码具有自定义数量的自定义参数。 我的意思是,我想用不同的返回类型和不同的参数推出不同的方法。 例如: public double Sum (double a, double b) {return a + b;} public char GetFirst (string a) {return a[0];} public bool canFlipTable (object[] thingsOnIt) {return thingsOnIt.Length <= 3;} DoTheThing thing1 = new DoTheThing(Sum); DoTheThing thing2 = new DoTheThing(GetFirst); DoTheThing thing3 = new DoTheThing(canFlipTable); thing1.Call(10.3, 5.6); //15.9 thing2.Call(“Hello World”); //’H’ thing3.Call(new object[] {new Lamp(), […]

使用运行时已知的类型创建委托

如何创建仅在运行时已知类型的委托? 我想做以下事情: Type type1 = someObject.getType(); Type type2 = someOtherObject.getType(); var getter = (Func)Delegate.CreateDelegate( typeof(Func).MakeGenericType(type1, type2), someMethodInfo); 我怎样才能达到类似的效果?

存储/传递代理作为变量

我是C#的新手,正致力于实现使用串行通信的动态GUI。 我最初来自C,所以函数指针的概念很熟悉。 基本上我想在处理串行命令时调用answerFunction()函数。 理论上:我有一个类lbl_txtBox_Pair,它是在运行时动态创建的。 我有一个类comObject,它与串行端口通信。 我有一个第三类comPacket,它包含有关一个串行命令的所有信息。 在类的对象lbl_txtBox_Pair中,我实例化一个数据包并告诉它在串行命令完成时应该调用哪个函数。 我将数据包Object提供给comObject实例。 在处理完之后,comObject想要通过调用存储在分组对象中的委托来发信号通知分组的原始发送者。 出于某种原因,我无法让它发挥作用。 它告诉我数据包的属性不可调用。 我做了一件非常错误的事吗? 这是代码:首先是类“lbl_txtBox_Pair”中的代码。 我在这里创建了comPacket并将其提供给comObject。 public delegate void answerHandler( comPacket packet); public void txb_value_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == (char)Keys.Return) { answerHandler answerMethod = new answerHandler(this.processAnswer); comPacket question = new comPacket(this.command, answerMethod, 1); comObject.addPacket(question); } } comPacket的构造函数。 这里代理被存储以便稍后调用。 public Delegate answerFunction; public comPacket(string cmd, […]

如何在VB.NET中使用C#编写的以下事件/ delgates?

我在我的ASP.NET网络应用程序中使用JdSoft的APNS-Sharp库。 该库是用C#编写的,并广泛使用委托函数和事件来进行线程处理。 我的应用程序是用VB.NET编写的,我对如何翻译以下示例代码(C#)感到困惑: …. //Wireup the events service.Error += new FeedbackService.OnError(service_Error); …. } static void service_Error(object sender, Exception ex) { Console.WriteLine(…); } 以下是FeedbackService类的相关成员: public delegate void OnError(object sender, Exception ex); public event OnError Error; 基本上,我试图弄清楚如何将函数(如service_Error)附加到VB.NET中的事件(如Error)。 我不清楚+ =语法在这个上下文中意味着什么,VisualStudio说我的VB.NET代码由于某种原因无法直接访问’Error’事件。 谢谢!

有没有办法导致传递给Control.BeginInvoke的委托的类型推断?

Control.BeginInvoke : 在这两种情况下,似乎很清楚编译器具有推断委托类型所需的所有信息。 然而,在这两种情况下,类型推断似乎都不起作用: BeginInvoke(myMethodThatTakesNoParams); 产生编译器错误 错误105’System.Windows.Forms.Control.BeginInvoke(System.Delegate)’的最佳重载方法匹配有一些无效的参数 同样如此 BeginInvoke(ShowProcessErrors, new object[] { process }); 两个方法调用只有在我将其更改为explitly创建委托并传递它时才会编译。 以下两种编译都很好: BeginInvoke(new MethodInvoker(myMethodThatTakesNoParams)); 和 BeginInvoke(new ProcessErrorDelegate(ShowProcessErrors), new object[] { process }); 似乎没有任何明显的理由为什么类型推断在这里不起作用。 有没有办法调用BeginInvoke而不显式创建委托?

连接事件处理程序的这两种语法有什么区别?

可能重复: 在C#中附加事件处理程序的两种不同方式是否存在实际差异? 我已经看到很多代码看起来像这样: foo.Drop += new DragEventHandler(fooHandler); 但在过去,我总是这样做: foo.Drop += fooHandler; 这两种语法之间有区别吗? 如果是这样,那么做到这一点有什么好处吗?

这个委托调用在这行代码(C#)中做了什么?

这是来自agsXMPP .Net程序集的示例。 我已经阅读了代理人,但我不确定这段代码是如何适应的(等待登录发生,然后发送消息。我想我正在寻找的是理解为什么delegate(0)用我能理解的那种简单的术语来实现这一点。 xmpp.OnLogin += delegate(object o) { xmpp.Send(new Message(new Jid(JID_RECEIVER), MessageType.chat, “Hello, how are you?”)); };

.NET2中的Action委托 – 使用generics类型’System.Action ‘需要’1’类型参数

我正在将工作代码从.NET4移植到.NET2(WinCE设备)。 在.NET2中不允许使用不带参数且不返回任何值的Action 编译错误在第5行:使用generics类型’System.Action’需要’1’类型参数 解决方法的想法? //first state is the default for the system public enum States { EnterVoucherCode, EnterTotalSale, ProcessVoucher }; public enum Events { PressNext, PressRedeem, ProcessSuccess, ProcessFail, PressBackToVoucherCode }; public States State { get; set; } private Action[,] fsm; //Fails to compile here public FiniteStateMachine() { //array of action delegates fsm = new Action[3, […]

通过reflection创建委托

给定一个包含的程序集 namespace Foo{public class Bar;} 如何在不编译时引用第一个程序集的情况下从另一个程序集创建Action ?