Tag: delegates

在muticast委托上使用慢速DynamicInvoke的替代方法

我在基类中有以下代码: public static void InvokeExternal(Delegate d, object param, object sender) { if (d != null) { //Check each invocation target foreach (Delegate dDelgate in d.GetInvocationList()) { if (dDelgate.Target != null && dDelgate.Target is System.ComponentModel.ISynchronizeInvoke && ((System.ComponentModel.ISynchronizeInvoke)(dDelgate.Target)).InvokeRequired) { //If target is ISynchronizeInvoke and Invoke is required, invoke via ISynchronizeInvoke ((System.ComponentModel.ISynchronizeInvoke)(dDelgate.Target)).Invoke(dDelgate, new object[] { sender, param }); […]

如何通过LINQ调用函数委托?

我想我在这里问正确的问题…… 我有4个存储过程,它们返回相同数据的不同子集。 我将此数据映射到服务器应用程序中的同一对象。 我将代码设置如下: internal static MyDataContext dc = new MyDataContext(); internal static List getData(DataType data) { List obj = null; switch (data) { case DataType.Type1: obj = mapObj(dc.getDataType1); break; case DateType.Type2: obj = mapObj(dc.getDataType2); break; … } } // This gives me an error that type T cannot be defined // private static List […]

如何发出返回ref的动态方法?

我正在浏览ref返回的来龙去脉,并且无法发出一个由ref返回的动态方法。 手工制作的lambdas和现有方法按预期工作: class Widget { public int Length; } delegate ref int WidgetMeasurer(Widget w); WidgetMeasurer GetMeasurerA() { return w => ref w.Length; } static ref int MeasureWidget(Widget w) => ref w.Length; WidgetMeasurer GetMeasurerB() { return MeasureWidget; } 但是发出动态方法失败了。 注意 :我在这里使用Sigil 。 道歉,我对System.Reflection.Emit不太熟悉。 WidgetMeasurer GetMeasurerC() { FieldInfo lengthField = typeof(Widget).GetField(nameof(Widget.Length)); var emitter = Emit.NewDynamicMethod() .LoadArgument(0) .LoadFieldAddress(lengthField) […]

如何声明返回相同类型的Func委托的Func委托?

我想编写一个方法来做一些工作,最后返回另一个方法与原始方法相同的签名。 这个想法是依次处理一个字节流,而不是进入递归。 通过这样称呼它: MyDelegate executeMethod = handleFirstByte //What form should be MyDelegate? foreach (Byte myByte in Bytes) { executeMethod = executeMethod(myByte); //does stuff on byte and returns the method to handle the following byte } 要切换方法,我想将它们分配给Func委托。 但我遇到的问题是,这导致递归声明而没有终止… Func<byte, Func<byte, <Func>> 我不知何故在这里迷路了。 我怎么能绕过那个?

使用Delegate调用构造函数

我发现了这个,但试图使用它并失败了。 如何使用reflection创建对象并通过将其置于委托中来加快速度? DynamicMethod dm = new DynamicMethod(“MyCtor”, t, new Type[] { }); var ctor = t.GetConstructor(new Type[] { }); ILGenerator ilgen = dm.GetILGenerator(); ilgen.Emit(OpCodes.Ldarg_0); ilgen.Emit(OpCodes.Newobj, ctor); ilgen.Emit(OpCodes.Ret); var d = (Func)dm.CreateDelegate(t); dm.Invoke(null, new object[] { }); 在把它删除之前我试图至少调用它,当我在上面做的时候我得到了错误 An unhandled exception of type ‘System.Reflection.TargetInvocationException’ occurred in mscorlib.dll 附加信息:调用目标抛出了exception。 如果我调用d()而不是我得到exception An unhandled exception of type ‘System.ArgumentException’ occurred […]

C#:虚拟函数调用甚至比委托调用更快?

我刚刚遇到一个代码设计问题。 说,我有一个“模板”方法,可以调用一些可能“改变”的函数。 直观的设计是遵循“模板设计模式”。 将更改函数定义为要在子类中重写的“虚拟”函数。 或者,我可以使用没有“虚拟”的委托function。 注入委托函数,以便它们也可以自定义。 最初,我认为第二种“委托”方式比“虚拟”方式更快,但是一些编码片段certificate它不正确。 在下面的代码中,第一个DoSomething方法遵循“模板模式”。 它调用虚方法IsTokenChar。 第二个DoSomthing方法不依赖于虚函数。 相反,它有一个传入代理。 在我的电脑中,第一个DoSomthing总是比第二个快。 结果如1645:1780。 “虚拟调用”是动态绑定,应该比直接委托调用更耗时,对吗? 但结果表明它不是。 有人可以解释一下吗? using System; using System.Diagnostics; class Foo { public virtual bool IsTokenChar(string word) { return String.IsNullOrEmpty(word); } // this is a template method public int DoSomething(string word) { int trueCount = 0; for (int i = 0; i < repeat; […]

如何在List 中为Find()创建一个好的谓词委托?

在查看MSDN之后,我仍然不清楚如何使用T的成员变量(其中T是一个类)在List中使用Find()方法形成一个正确的谓词 例如: public class Car { public string Make; public string Model; public int Year; } { // somewhere in my code List carList = new List(); // … code to add Cars … Car myCar = new Car(); // Find the first of each car made between 1980 and 2000 for (int x = […]

将枚举元素作为事件参数传递给C#

是否可以将Enum元素作为事件参数传递? 假设我有…… public class Letters { public delegate void StateChangedEventHandler(object sender, EventArgs e); public event StateChangedEventHandler StateChanged; public AbcState state = AbcState.Aaa; public AbcState State { get{return this.state;} set { this.state = value; this.OnStateChanged(); } } public enum AbcState { Aaa, Bbb, Ccc } protected virtual void OnStateChanged() { StateChanged?.Invoke(this, State); } 看看我如何尝试将枚举元素作为事件参数传递? 现在,我通常会创建一个类并扩展EventArgs,然后我就能够传递类本身。 我知道我可以在这里做同样的事情,创建一个扩展EventArgs的不同类,然后在类中创建枚举,字段和属性。 […]

C#:SomeEvent + = Method和SomeEvent + = new Delegate(方法)之间的区别是什么

可能重复: 我应该创建一个新的代理实例吗? 嗨,我已经尝试过搜索这个问题的答案了,但是我真的不知道要搜索哪些术语,并且没有任何网站建议的问题是相关的。 我确信这之前一定已经得到了解答。 基本上,有人可以告诉我C#中这两行之间的区别是什么: SomeEvent += SomeMethod SomeEvent += new SomeDelegate(SomeMethod) 例如: DataContextChanged += App_DataContextChanged; DataContextChanged += new DependencyPropertyChangedEventHandler(App_DataContextChanged); 他们似乎都做同样的事情。

control.BeginInvoke()无法调用委托

我注意到control.BeginInvoke(委托)有时无法调用委托。 我知道BeginInvoke只是创建一个PostMessage,该消息稍后由应用程序处理(默认情况下,消息后限制为10,000)。 鉴于我们的应用程序不是很复杂,还有其他原因导致它无法执行委托吗? 我的代码如下所示。 class MyClass : Form{ private bool executing = false; private delegate void DelegateBar(string info, int total, bool status, object obj); private void Bar(string info, int total, bool status, object obj){ log(“Enterning Bar”); // Update something on UI executing = false; log(“Exiting Bar”); } public void foo(){ log(“Entering Foo”); executing = true; […]