- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有以下问题:我想调用 Delegate.CreateDelegate
从我针对 .NET 4.5、Windows Phone 8 和 Windows 8 商店应用程序的可移植类库中,但我的代码无法编译。编译器说它无法在 Delegate
上找到该方法类型。
有趣的是,例如Microsoft 的 PRISM 库可以从可移植类库中调用“Delegate.CreateDelegate”。它在 DelegateReference
中这样做类(class)。 PRISM 可移植类库面向 .NET 4.0、Windows 8 Store Apps、Windows Phone 8 和 Silverlight 5(因此是一个更加严格的集合)。
未编译的代码如下所示:
public class MyClass
{
public void MyMethod<T>(EventHandler handler)
{
var @delegate = Delegate.CreateDelegate(typeof (OpenEventHandler<T>), null, handler.GetMethodInfo());
}
}
public delegate void OpenEventHandler<in T>(T target, object sender, EventArgs arguments);
可在此处下载示例:https://dl.dropboxusercontent.com/u/14810011/PortableClassLibraryReferenceProblem.zip
它包含我的库项目和一个非常精简的 PRISM PubSubEvents 项目版本,仅包含 DelegateReference
类及其接口(interface)。后者的完整源代码可以在这里找到:http://prismwindowsruntime.codeplex.com/SourceControl/latest
我能做些什么来使用所有 Delegate
成员?预先感谢您的帮助!
EDIT 在 Henk Holterman 的回答之后:
GetMethodInfo() 是 PCL 子集支持的扩展方法。无论如何,这与我无法调用Delegate.CreateDelegate
的问题无关。而 PRISM 的 PCL 项目可以。
EDIT 2 在 Hans Passants 评论之后:
我只是玩了一下,发现当我激活 Silverlight 5 作为可移植库的目标时 Delegate.CreateDelegate
确实可以访问(并且 GetMethodInfo 扩展方法不再是)。是Delegate.CreateDelegate
那么可能会在内部映射到 Windows 8 商店和电话应用程序的另一个 API?这是我唯一能想到的方法,因为我将 Silverlight 5 添加为有效目标,所以突然可以访问此方法。
(您可以通过右键单击“MyPortableClassLibrary”项目,单击“属性”并在“库”选项卡中单击更改以选择可移植库所针对的框架来重现此内容。)
此外,今天早些时候,我创建了一个 Windows Store App 项目,发现没有 CreateDelegate
Delegate
上定义的方法适用于 Windows 运行时的 .NET 中的类。
在我的实际项目中,我不想以 Silverlight 5 为目标,因为我使用 IObservable<T>
和 IObserver<T>
大量使用 Rx,并且这些接口(interface)未在 Silverlight 中定义。
最佳答案
好的,经过一夜的 sleep 后,我意识到我的问题实际上应该是“如何在 Windows 运行时引入的新 API 中动态创建委托(delegate)?”。正如 Rafael 在我的问题的评论中指出的那样,除了 .NET 之外,当 Windows 8/Phone 8 成为目标时,还提供了不同的 API。如果 Silverlight 也作为目标,那么 Windows 8/Phone 8 中不可用的 API 将被映射,这解释了为什么我可以在将 Silverlight 添加为可移植类的目标时突然调用 Delegate.CreateDelegate
图书馆。在 .NET 中,.NET 4.5 引入了用于反射的新 API。
无论如何,要在 Windows 8/Windows Phone 8 中创建委托(delegate),必须使用 MethodInfo.CreateDelegate
方法,就像这样:
public class MyClass
{
public void MyMethod<T>(EventHandler handler)
{
var methodInfo = handler.GetMethodInfo();
var @delegate = methodInfo.CreateDelegate(typeof(OpenEventHandler<T>), null);
}
}
public delegate void OpenEventHandler<in T>(T target, object sender, EventArgs arguments);
关于c# - 为什么我不能在我的可移植类库中调用 Delegate.CreateDelegate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18148849/
我正在尝试创建委托(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;
我是一名优秀的程序员,十分优秀!