Tag: 代表

使用Moq模拟Delegate.Invoke()会在LINQ中引发InvalidCastexception

假设我有IService接口: public interface IService { string Name { get; set; } } 以及返回此接口的委托Func 。 在我的unit testing中,我想使用Moq模拟委托的Invoke()方法,如下所示: [TestMethod] public void UnitTest() { var mockService = new Mock(); var mockDelegate = new Mock<Func>(); mockDelegate.Setup(x => x.Invoke()).Returns(mockService.Object); // The rest of the test } 不幸的是, mockDelegate.Setup(…)抛出System.InvalidCastException : 测试方法UnitTest抛出exception: System.InvalidCastException:无法将类型为“System.Linq.Expressions.InstanceMethodCallExpressionN”的对象强制转换为“System.Linq.Expressions.InvocationExpression”。 在Moq.ExpressionExtensions.GetCallInfo(LambdaExpression表达式,模拟模拟) 在Moq.Mock。 c_ DisplayClass1c`2.b _1b() 在Moq.PexProtector.Invoke(Func`1函数) 在Moq.Mock.Setup(模拟1 mock, Expression […]

+ =代表的运算符

我知道+ =运算符会将一个方法添加到由Delegate基础对象维护的调用列表中 using System; class Program { delegate void MyDelegate(int n); void Foo(int n) { Console.WriteLine(“n = {0}”, n) } static void Main(string[] args) { MyDelegate d = new MyDelegate(Foo); d += Foo; // add Foo again d.Invoke(3); // Foo is invoked twice as Foo appears two times in invocation list } } 但是当我查看MSDN Delegate时 […]

使用/不使用委托()启动线程

有什么区别: new Thread(new ThreadStart(SomeFunc)) 和: new Thread( delegate() { SomeFunc();} ) 此代码在我的计算机上提供奇怪的输出: public class A { int Num; public A(int num) { Num = num; } public void DoObj(object obj) { Console.Write(Num); } public void Do() { Console.Write(Num); } } /////// in void main() for (int i = 0; i < 10; i++) { (new […]

代表和活动

我创建了一个非常简单的虚拟程序来理解委托和事件。 在我的下面的程序中,我很简单地调用一个方法。 当我调用一个方法时,在代理和事件的帮助下自动调用五个方法。 请看一下我的程序,并告诉我我错在哪里或者正确,因为这是我第一次使用代表和活动。 using System; namespace ConsoleApplication1 { public delegate void MyFirstDelegate(); class Test { public event MyFirstDelegate myFirstDelegate; public void Call() { Console.WriteLine(“Welcome in Delegate world..”); if (myFirstDelegate != null) { myFirstDelegate(); } } } class AttachedFunction { public void firstAttachMethod() { Console.WriteLine(“ONE…”); } public void SecondAttachMethod() { Console.WriteLine(“TWO…”); } public void thirdAttachMethod() […]

如何通过C#中的类型创建动态委托对象?

假设我有一个type ,我知道它是从Delegate类型派生的。 我想创建一个这种类型的对象包装一个匿名委托,它接受任意参数并返回一个正确返回类型的对象: var retType = type.GetMethod(“Invoke”).ReturnType; var obj = Delegate.CreateDelegate(type, delegate(object[] args) { … if (retType != typeof(void)) … somehow create object of type retType and return it … }); 显然这不会编译,因为CreateDelegate期望一个MethodInfo作为第二个参数。 我该怎么做才能正确? 更新:关于我想要达到的目标的更多信息。 运行了两个应用程序 – 浏览器中的客户端和C#中的服务器。 浏览器能够通过将参数序列化为JSON并通过网络发送呼叫(如RPC)来调用服务器端的远程function。 这已经有效,但我想添加对回调的支持。 例如: JavaScript(客户端): function onNewObject(uuid) { console.log(uuid); } server.notifyAboutNewObjects(onNewObject); C#(服务器): void notifyAboutNewObjects(Action callback) { … callback(“new-object-uuid”); … […]

C#(或其他语言)中代理人的使用

我一直想知道代表们如何有用,我们为什么要使用它们? 除了类型安全以及Visual Studio文档中的所有这些优点之外,代表的真实用途是什么。 我已经找到一个,它非常有针对性。 using System; namespace HelloNamespace { class Greetings{ public static void DisplayEnglish() { Console.WriteLine(“Hello, world!”); } public static void DisplayItalian() { Console.WriteLine(“Ciao, mondo!”); } public static void DisplaySpanish() { Console.WriteLine(“Hola, imundo!”); } } delegate void delGreeting(); class HelloWorld { static void Main(string [] args) { int iChoice=int.Parse(args[0]); delGreeting [] arrayofGreetings={ new delGreeting(Greetings.DisplayEnglish), […]

在特定线程C#上调用委托

有没有办法让代理在特定的线程上运行? 说我有: CustomDelegate del = someObject.someFunction; Thread dedicatedThread = ThreadList[x]; 我是否可以拥有一致的后台长时间运行线程,并在需要时调用我自己的代理。 它必须每次都是相同的线程。 [编辑] 我希望它在专用线程上的原因是时间是我打算在它上面运行委托并在y毫秒后挂起线程,并在我运行另一个委托时恢复线程。 我觉得这是不可能的。 我将有一个委托队列,让线程的主要function从它读取并运行。 为了澄清一个具体的例子,我有一个带有一堆玩家线程的游戏系统。 我希望每个playerthread都可以在其上运行游戏事件的事件处理程序。 如果事件处理程序花费太多时间,我希望能够通过暂停其线程来暂停该特定玩家直到下一个事件。 因此,有一个专用线程,我可以运行多个事件处理程序,我可以暂停一个特定的玩家的AI,以防它被窃听或花费太长时间。

方法名称是否隐式转换为委托类型?

我在理解代表方面遇到了一些麻烦。 我有一个委托,我将在输入你的字符时调用: public delegate void respondToY(string msgToSend); private respondToY yHandler; 我有一个订阅方法,以便在调用委托时调用代码可以要求通知: public void Subscribe(respondToY methodName) { yHandler += methodName; } 据我所知,要注册这个代表,我需要提供一些类型的responseToY。 然而,当调用subscribe方法时,我可以提供委托的新实例或简单地提供方法的名称。 这是否意味着可以使用与委托签名匹配的任何方法,并自动将其转换为正确的委托类型? **编辑** 因此,基于此假设,仅为按钮的单击事件处理程序提供方法名称(如果方法采用发件人和相关事件对象)也是有效的,它将转换为所需的委托?

组播代理C#

我正在研究代表们。 在我读的时候。 我了解到在委托中添加多个函数称为多播委托。 基于此,我写了一个程序。 这里我在MyDelegate中添加了两个函数(AddNumbers和MultiplyNumbers)。 以下程序是多播委托的示例吗? public partial class MainPage : PhoneApplicationPage { public delegate void MyDelegate(int a, int b); // Constructor public MainPage() { InitializeComponent(); MyDelegate myDel = new MyDelegate(AddNumbers); myDel += new MyDelegate(MultiplyNumbers); myDel(10, 20); } public void AddNumbers(int x, int y) { int sum = x + y; MessageBox.Show(sum.ToString()); } public void […]

如何在运行时动态创建Action ?

我希望能够在运行时执行以下等效操作: var action = new Action(obj => Console.WriteLine(“Called = ” + obj)); 我知道我需要为Action获取正确的类型,但不知道如何使用Delegate.Create获取最后一位。 在Action定义中Type表示T. var actionType = typeof(Action).MakeGenericType(Type); var constructor = actionType.GetConstructors()[0]; var @delegate = Delegate.CreateDelegate(actionType, ); 人们似乎缺少的一点是我正在尝试创建一个Action实例,其中T不能静态指定,因为它是从一个派生自Attribute的类中使用的 – 这意味着T可以是任何东西而且它不能被定义为通用定义 干杯