为什么我无法在可移植类库中调用 Delegate.CreateDelegate?

2023-11-25

我有以下问题:我想打电话Delegate.CreateDelegate从我的针对 .NET 4.5、Windows Phone 8 和 Windows 8 Store 应用程序的可移植类库中,但我的代码无法编译。编译器说它找不到该方法Delegate type.

有趣的是,例如Microsoft 的 PRISM 库可以从可移植类库调用“Delegate.CreateDelegate”。它这样做是在DelegateReference班级。 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类及其接口。后者的完整源代码可以在这里找到:http://prismwindowsruntime.codeplex.com/SourceControl/latest

我可以做什么来使用所有Delegate成员?预先感谢您的帮助!

EDIT亨克·霍尔特曼回答后:

GetMethodInfo() 是 PCL 子集支持的扩展方法。无论如何,这与我无法调用的问题无关Delegate.CreateDelegate而 PRISM 的 PCL 项目可以。

Picture of code that does not compile

EDIT 2汉斯·帕桑斯评论后:

我只是玩了一下,发现当我激活 Silverlight 5 作为便携式库的目标时Delegate.CreateDelegate确实可以访问(并且 GetMethodInfo 扩展方法不再可以访问)。是Delegate.CreateDelegate那么可能会在内部映射到 Windows 8 商店和手机应用程序的另一个 API?这是我能想到如何突然访问此方法的唯一方法,因为我将 Silverlight 5 添加为有效目标。

(您可以通过右键单击“MyPortableClassLibrary”项目,单击“属性”并在“库”选项卡中单击更改以选择可移植库所针对的框架来重现此内容。)

另外,今天早些时候,我创建了一个 Windows 应用商店应用程序项目,发现没有CreateDelegate方法定义在Delegate.NET 中用于 Windows 运行时的类。

在我的实际项目中,我不想使用 Silverlight 5IObservable<T> and IObserver<T>大量使用 Rx 并且这些接口未在 Silverlight 中定义。


好吧,经过一夜的睡眠,我意识到我的问题实际上应该是“如何在 Windows 运行时引入的新 API 中动态创建委托?”。正如 Rafael 在我的问题的评论中指出的,除了 .NET 之外,当 Windows 8 / Phone 8 为目标时,还提供了不同的 API。如果 Silverlight 也成为目标,那么 Windows 8 / Phone 8 中不可用的 API 将被映射,这解释了为什么我可以突然调用Delegate.CreateDelegate当我添加 Silverlight 作为可移植类库的目标时。在 .NET 中,新的反射 API 是随 .NET 4.5 引入的。

无论如何,要在 Windows 8 / Windows Phone 8 中创建委托,必须使用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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我无法在可移植类库中调用 Delegate.CreateDelegate? 的相关文章

  • 为什么相同的代码在同一台计算机上的执行时间可能不同?

    我是 C 编程新手 我编写了代码并希望获得它的运行时 这就是我所做的 每次运行代码时 我都会得到不同的运行时值 这样对吗 或者我的代码有问题吗 int main int argc char argv time t start end sta
  • 如何在 Visual Studio 2010 中增强 XAML 设计器?

    当我使用 XAML 设计器时 进入设计器和退出设计器是如此困难和缓慢 当我这样做时 Visual Studio 卡了一段时间 有什么方法可以增强 XAML 设计器和编辑器吗 Ant 保存 XAML 文件时非常慢 这通常意味着您可能有复杂的
  • 用 C++ 进行服装建模 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在编写一些软件 最终会绘制一个人体框架 可以配置各种参数 并且计划是在假人身上放置某种衣服 我研究
  • 在 C# 中创建具有单独列的分隔文本

    我一直在尝试在 C 中创建一个制表符限制的文本文件 以便数据正确显示在单独的列中 Firstname Lastname Age John Smith 17 James Sawyer 31 我尝试过 t 字符 但我得到的只是 Firstnam
  • std::cout 和 std::wcout 有什么区别?

    在c 中 有什么区别std cout and std wcout 它们都控制流缓冲区的输出或将内容打印到控制台 或者它们只是相似吗 它们作用于不同的字符类型 std cout uses char作为字符类型 std wcout uses w
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • 如何编写一个同时需要请求和响应Dtos的ServiceStack插件

    我需要提供本地化数据服务 所有本地化的响应 Dto 都共享相同的属性 IE 我定义了一个接口 ILocalizedDto 来标记那些 Dto 在请求端 有一个ILocalizedRequest对于需要本地化的请求 Using IPlugin
  • 私有模板函数

    我有一堂课 C h class C private template
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • gcc 的配置选项如何确定默认枚举大小(短或非短)?

    我尝试了一些 gcc 编译器来查看默认枚举大小是否很短 至少一个字节 强制使用 fshort enums 或无短 至少 4 个字节 强制使用 fno short enums user host echo Static assert 4 si
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐