gpt4 book ai didi

c# - 为什么我不能在我的可移植类库中调用 Delegate.CreateDelegate?

转载 作者:可可西里 更新时间:2023-11-01 08:55:44 24 4
gpt4 key购买 nike

我有以下问题:我想调用 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 项目可以。

Picture of code that does not compile

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com