Tag: 代表

为一个事件两次查询一名代表

我最近被问到一个问题,如果我要两次查询一个处理程序会发生什么。 我来告诉你代码: public delegate void OpenEventHandler(object sender, EventArgs e); public class MyWindow { public event OpenEventHandler Open; public void OpenWindow() { if (Open != null) { Open(this, new EventArgs()); } } } public class TwoDelegates { public static void HandleOpen(Object sender, EventArgs e) { Console.WriteLine(“Birds fly”); (sender as MyWindow).Open -= HandleOpen; } public static void […]

在私有静态方法的C#中进行unit testing,接受其他私有静态方法作为委托参数

我拥有:我有一个非静态类,其中包含两个私有静态方法:其中一个可以作为委托参数传递给另一个: public class MyClass { … private static string MyMethodToTest(int a, int b, Func myDelegate) { return “result is ” + myDelegate(a, b); } private static int MyDelegateMethod(int a, int b) { return (a + b); } } 我要做的事情:我必须测试(使用unit testing)私有静态方法MyMethodToTest ,并将私有静态方法MyDelegateMethod作为委托参数传递给它。 我能做什么:我知道如何测试私有静态方法,但我不知道如何将同一个类的另一个私有静态方法作为委托参数传递给此方法。 因此,如果我们假设MyMethodToTest方法根本没有第三个参数,那么测试方法将如下所示: using System; using System.Reflection; using Microsoft.VisualStudio.TestTools.UnitTesting; … [TestMethod] public void MyTest() { […]

C#代表教程工作

我之前没有使用过代理人,我正试图按照我的书中的教程来解决这些问题。 到目前为止,我已经发现委托可以与类的方法一起使用,该类返回相同类型的对象,并且与调用委托的代理重载(如果我错了,请纠正我)。 在我正在研究的教程中,以下代码被添加到Car Class: public delegate void CarEngineHandler(string msgForCaller); private CarEngineHandler listOfHandlers; public void RegisterWithCarEngine(CarEngineHandler methodToCall) { listOfHandlers = methodToCall; } 在Main控制台应用程序中,调用以下代码: static void Main(string[] args) { Car c1 = new Car(“Slugbug”, 100, 10); c1.RegisterWithCarEngine(new Car.CarEngineHandler(OnCarEngineEvent)); Console.WriteLine(“**** Speeding Up ******”); for (int i = 0; i {0}”, msg); Console.WriteLine(“*************************************\n”); } 这是Accelerate方法: public void Accelerate(int delta) […]

如何在C#中的类型安全集合中存储具有约束generics类型的Action委托?

假设我想将代理存储在这样的集合中: public void AddDelegate(Action action) where T : ISomething { _delegates.Add(action); } _delegates的类型应该是什么? 尝试使用IList<Action> _delegates; 导致错误消息Argument type ‘System.Action’ is not assignable to parameter type ‘System.Action’上面的Add调用的Argument type ‘System.Action’ is not assignable to parameter type ‘System.Action’ 。 但为什么不起作用? 编译器应该“知道”T必须是ISomething 。 如果我不想通过使用例如IList或参数化generics类型T上的整个类来放弃类型安全,我有哪些选择?

.NET委托是否用于事件?

我有点困惑,我知道委托就像函数指针一样,它们用于将函数作为参数传递给方法。 这如何适合事件模型? 呼叫: myButton.OnClick += new …..(); 在事件发生时,内部只是将方法/函数作为参数传递,并且所有订阅者都会收到有关该事件的通知吗?

有没有办法在C#中简化这个reflection代理代码?

在这个响应中,我提出了以下帮助方法,可以由不同的Task创建者重用,以将事件转换为任务完成源。 // Helper method static Task TaskFromEventHelper(object target, string eventName, Func<TaskCompletionSource, object> resultSetterFactory) { var tcs = new TaskCompletionSource(); var addMethod = target.GetType().GetEvent(eventName).GetAddMethod(); var delegateType = addMethod.GetParameters()[0].ParameterType; var d = Delegate.CreateDelegate(delegateType, resultSetterFactory(tcs), “Invoke”); addMethod.Invoke(target, new object[] {d}); return tcs.Task; } // Empty events (Action style) static Task TaskFromEvent(object target, string eventName) { return TaskFromEventHelper(target, eventName, […]

当属性类型未知时,通过reflection创建属性访问者的委托

在.NET 2.0(使用C#3.0)中,当我在编译时不知道它的类型时,如何为通过reflection获得的属性访问器创建委托? 例如,如果我有int类型的属性,我可以这样做: Func getter = (Func)Delegate.CreateDelegate( typeof(Func), this, property.GetGetMethod(true)); Action setter = (Action)Delegate.CreateDelegate( typeof(Action), this, property.GetSetMethod(true)); 但如果我不知道该属性在编译时是什么类型,我不知道该怎么做。

无法理解真实世界场景中代表的使用

我无法理解.NET世界中代理人的正确使用。 代表们无法解决的问题是什么? 我想知道什么情况/情况是理想的或代表使用的候选人。 我知道LINQ和Lambda表达式都在后台使用Delegates。 我知道如何创建和使用它,但我无法理解的是为什么我应该创建和使用它们? 任何真实世界的例子或经验分享都将受到高度赞赏。 更新: 我创建了以下类 using System; using System.Collections.Generic; using System.Linq; namespace Basics { public class Program { static void Main() { Flight.FlightTakeOffDelegate flightDelegate; var flights = new List { new Flight {Number = “FL001”, DepartureTime = DateTime.Now, TotalCrew = 15}, new Flight {Number = “FL002”, DepartureTime = DateTime.Now.AddHours(1), TotalCrew = 15}, […]

如何在backgroundworker中更改ListView? 跨线程错误

可能重复: 避免交叉线程操作错误的最简洁和正确的方法? 我在运行程序时遇到错误…. {“跨线程操作无效:控制’listView1’从其创建的线程以外的线程访问。”} private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { TestObject argumentTest = e.Argument as TestObject; string[] lines = argumentTest.ThreeValue.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); HtmlAgilityPack.HtmlDocument document = new HtmlAgilityPack.HtmlDocument(); foreach (string vr in lines) { string country = argumentTest.OneValue.Trim(); string url = vr + country + ‘/code/’ + argumentTest.TwoValue.Trim(); string sourceCode = WorkerClass.getSourceCode(url); […]

中止以Delegate.BeginInvoke开头的线程

免责声明 :我知道Thread.Abort是邪恶的。 我使用它作为最后的手段,因为一些I / O函数(例如,在不存在的网络共享上使用File.Exists )会阻塞大量的时间,并且不允许您指定超时。 问题 :是否可以使用Delegate.BeginInvoke中止工作线程(如在Thread.Abort )或者我是否必须自己进行线程处理?