- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个问题,Test1 产生“System.ArgumentException:方法参数长度不匹配”,而 Test2 和 Test3 正常通过。我需要使用反射订阅一个事件,如果我使用简单的方法一切正常,但是当我进入 lambda 时,它会按预期停止工作。
所有 lambda 的调试显示它们是“Void <>m__0(Int32)”,这是正确的事件类型,与“eventInfo.EventHandlerType”相同。
为什么会失败?或者,如何解决这个问题?
C# 是否像 Test1 一样向由 lambda 创建的方法添加更多参数?
::完整代码在这里:
public class A
{
public void Test1()
{
var str = "aa";
B.Subscribe(typeof(C), "myEvent", (int a) => { var any = str; }, null);
}
public void Test2()
{
B.Subscribe(typeof(C), "myEvent", (int a) => { var any = a; }, null);
}
public void Test3()
{
B.Subscribe<int>(typeof(C), "myEvent", callback, this);
}
public void callback(int a) { }
}
public static class B
{
public static void Subscribe<T>(Type type, string eventName, Action<T> callback, object target)
{
var eventInfo = type.GetEvent(eventName, BindingFlags.GetField | BindingFlags.Public | BindingFlags.Static);
var handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, target, callback.Method);
eventInfo.AddEventHandler(null, handler);
}
}
public sealed class C
{
public static event Action<int> myEvent;
}
编辑:
显然这是 Mono 错误。获取委托(delegate)的 GetInvocationList()[0] 解决了上例中的问题。
但是订阅事件会产生“System.InvalidCastException:无法从源类型转换为目标类型。”如果事件不是 Action 类型而是自定义委托(delegate)类型:(如果类“C”是这样,它会抛出,如果类“C”是像上面那样,它会正常通过)
public sealed class C
{
public static event MyDel myEvent;
public delegate void MyDel(int a);
}
这是不同的问题吗?编辑 #2,事件预计 MyDel
类型,但得到 Action Int32。如何从 Action<T>
转换到 MyDel 或更好,到 eventInfo.EventHandlerType
,因为我不知道会发生什么类型的事件。
最佳答案
实际上,经过进一步调查后,我注意到我的目标
是错误的。
对于在类中定义的方法,类实例作为目标是可以的。对于 lambda,我认为它是 null,至少它适用于 null,只要它不干扰在创建 lambda 的方法中定义的局部变量。
因此Action 有一个属性Target,在Delegate.CreateDelegate
中使用callback.Target
解决了这个问题。
lambda 的目标实际上持有对类实例和它接触的所有局部变量的引用(调试器显示它)。
奇怪的是,它在最新的 .NET 上运行,可能是单声道和 .NET 之间的细微差别。
关于c# - 使用 lambda 作为方法的 Delegate.CreateDelegate 产生 "method argument length mismatch"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43464975/
我正在尝试创建委托(delegate)以在运行时读取/写入未知类型类的属性。 我有一个通用类 Main和一个看起来像这样的方法: Delegate.CreateDelegate(typeof(Func
这是 prior thread 的一种后续。我正在构建一个小型包装器来向上调用我的用户提供的动态类型化方法。该方案运作良好......但仅适用于静态方法。尽管 CreateDelegate 也应该适用
感谢 Jon Skeet 在 this 中的回答问题我有以下工作: public delegate BaseItem GetItemDelegate(Guid itemID); public stat
假设我想传递一个成员函数作为回调。 我应该使用什么来传递上下文 - bind() 或 createDelegate()? 我的意思是,这个: someObj.on('someEvent', this.
我有以下问题:我想调用 Delegate.CreateDelegate从我针对 .NET 4.5、Windows Phone 8 和 Windows 8 商店应用程序的可移植类库中,但我的代码无法编译
我一直在尝试使用反射来比较在编译时类型未知的对象,而不是每次尝试使用 CreateDelegate() 时都调用 Invoke()。到目前为止,我已经在基本类型等的通用类型类中使用它,但我遇到了类型为
这是我第一次尝试将用户定义的参数传递给 IE9 中 extjs(4.0.1) 中的处理程序函数。我有以下代码,但它抛出了一个错误,指出 SCRIPT438: Object doesn't suppor
这是我第一次尝试将用户定义的参数传递给 IE9 中 extjs(4.0.1) 中的处理程序函数。我有以下代码,但它抛出了一个错误,指出 SCRIPT438: Object doesn't suppor
使用 Jon Skeet 的文章 Making reflection fly and exploring delegates作为指南,我正在尝试使用 Delegate.CreateDelegate 方
在创建接口(interface)方法的委托(delegate)时,我正在努力寻找哪里出错了 我的代码如下: private static Func> FindScrapeMethod(ICrawler
编辑:我在 microsoft connect::上提交了错误报告: https://connect.microsoft.com/VisualStudio/feedback/details/61423
现在,我必须这样做 private delegate void set(int obj); //declare the prototype ... Delegate delegate1 = Deleg
我尝试为 this question 实现 Jon Skeet 的解决方案发布在此 blog post将 SetValue 方法替换为使用委托(delegate)的非反射方法。 与blog post中
我正在尝试使用 Delegate.CreateDelegate [MSDN link]绑定(bind)到静态泛型方法,但绑定(bind)失败。这是 PoC 代码: public static clas
我在看的实现 Observable.FromEvent(add, remove) 我正在努力了解它是如何工作的。让我们说 TEventHandler 是标准: public delegate void
我有一个静态方法: public class Example { //for demonstration purposes - just returns default(T) publ
关于Making reflection fly and exploring delegates的问题... 如果我需要创建委托(delegate) Func我可能会使用的动态加载类型的方法 (1) D
当我调用 CreateDelegate(delegateType) 时,我得到一个 System.ArgumentException,根据 MSDN,这是因为 delegateType 的参数数量错误
在遵循这个问题的答案后,我发现我必须使用 ref 参数来调用结构上的实例方法。 How can I create an open Delegate from a struct's instance m
运行 Run2 方法。但是Run方法没有运行。是什么原因 ?两种方法之间的唯一区别是因为参数。 public class MyClass { public string Name { get;
我是一名优秀的程序员,十分优秀!