Tag: 委托

团结和代表

我正在使用Unitydependency injection框架。 我有两个类,每个类在构造函数中使用相同的delegate参数。 解决后,每个类应该获得不同的方法。 我可以不使用属性进行设置吗? 如果不是,你会如何使用属性?

如何制作委托线程STA

我看到围绕这个主题的一些讨论并得出结论认为这是不可能的。 我应该使用Threads,使它成为STA,当我需要返回结果时,将主线程与创建的线程连接起来。 这可以工作,但它不是一个理想的解决方案,因为使用委托我可以实现纯异步行为(使用回调)。 所以,在我开始实现自己的Future类之前(就像在Java中一样); 有没有更好的方法来使用代表实现这一目标? private delegate String DelegateFoo(String[] input); private String Foo(String[] input){ // do something with input // this code need to be STA // below code throws exception .. that operation is invalid // Thread.CurrentThread.SetApartmentState(ApartmentState.STA) return “result”; } private void callBackFoo(IAsyncResult iar){ AsyncResult result = (AsyncResult)iar; DelegateFoo del = (DelegateFoo)result.AsyncDelegate; String result […]

如何将方法名称传递给另一个方法并通过委托变量调用它?

我有一个方法,包含指向另一个类的委托变量。 我想通过此委托调用该类中的方法,但将方法的名称作为字符串传递给包含委托的方法。 如何才能做到这一点? 用reflection? Func ? 编辑: 我现在明白,反思可能不是最好的解决方案。 这就是我所拥有的: private static void MethodContainingDelegate(string methodNameInOtherClassAsString) { _listOfSub.ForEach(delegate(Callback callback) { //Here the first works, but I want the method to be general and // therefore pass the method name as a string, not specfify it. callback.MethodNameInOtherClass(); //This below is what I am trying to get to work. […]

将代码作为参数传递给方法

我有一个方法列表几乎完全相同,除了一些差异: void DoWork(string parameter1, string parameter2) { //Common code … //Custom code … //Common code … } 我想通过从另一个方法传递自定义代码来重用公共代码来简化解决方案。 我假设我必须使用带参数的动作来完成这个,但无法弄清楚如何。

传递Func keySelector错误

static void Main() { string[] a = { “a”, “asd”, “bdfsd”, “we” }; a = a.OrderBy(fun).ToArray(); } private static int fun(string s) { return s.Length; } 它给出了编译时错误。 我知道我们可以用这样的Lambda表达式做到这一点。 a.OrderBy(s=>s.Length).ToArray(); 但我想通过定义不同的function来做到这一点。 我做错了什么?

奇怪的反编译代码来自generics类中的事件订阅代码

这个简单的课程 public class Test { public static void A(Window wa, Window wb) { wa.Closed += (s, e) => wb.Close(); } } 获取编译为this(我使用Reflector进行反编译): public class Test { [CompilerGenerated] private sealed class c__DisplayClass1 { public Window wb; public void b__0(object s, EventArgs e) { this.wb.Close(); } } public static void A(Window wa, Window wb) { wa.Closed += […]

C# – 命名空间中的类型声明

什么可能是在命名空间中声明类型但不在类中声明类型的可能用法。 例如: namespace Test { public delegate void Ispossible(); } 这是有效的,不会产生任何编译错误,但我想不出为什么我们会这样声明它而不是在类中。

Delegate不接受子类?

我的代表似乎不接受一个子类,我认为一个例子是最简单的。 public class A { public A() { } } public class B : A { public B() { } } public class Program { private delegate void CallBack(A a); private static CallBack callBack = new CallBack(Test); public Main(string[] args) { callBack(new B()); } private static void Test(A a) { Console.WriteLine(“Test()”); } // Compilation error […]

C#是否通过Value传递给Lambdas?

我有一些代码, int count = 0; list.ForEach(i => i.SomeFunction(count++)); 这似乎没有增加计数。 计数是否按此值传递? 如果我在lambda中使用{}有什么区别吗? int count = 0; list.ForEach(i => { i.SomeFunction(count++); }); 更新1 对不起,我的错误,它确实更新了原始计数。

C#::何时使用事件或从事件处理接口派生的对象集合?

我认为这是一个简单的“问题”,我已经找到了几个解决方案,但我不知道哪种方式可以用于C#中的最佳实践。 在应用程序的生命周期中,我有一个主对象(比如一个单例)。 这个“MasterClass”创建了一堆新类型的对象,每次调用MasterClass.Instance.CreateSlaveObject时都会说“SlaveClass”。 此MasterClass还监视一些其他对象的状态更改,当发生这种情况时,通知它创建的SlaveClass对象的更改。 看起来很简单。 因为我来自原生的C ++世界,所以我首先使用它来创建一个界面 Interface IChangeEventListener { void ChangeHappened(); } 我从中派生出“SlaveClass”。 然后在我的“MasterClass”中,我有: … IList slaveList; … CreateSlaveObject { … slaveList.Add(slave); } … ChangeHappened() { … foreach(var slave in slaveList) { slave.ChangeHappened(); } } 这很有效。 但是我一直在想,如果有另一种(更好的)方法可以做到这一点。 所以我对这个主题进行了更多研究,并看到了C#事件。 因此,我不是在MasterClass中维护一个奴隶集合,而是将MasterClass注入SlaveClass的ctor(或通过一个属性),让SlaveClass对象将它的ChangeHappened作为事件处理程序添加。 这将说明: …Master… public delegate void ChangeHappenedDelegate(object sender, NewsInfoArgs args); public event NewUpdateDelegate ChangeHappenedEvent; …. public […]