我有以下问题:我想Delegate.CreateDelegate
从面向 .NET 4.5、Windows Phone 8 和 Windows 8 应用商店应用程序的便携式类库中调用,但我的代码无法编译。编译器说它找不到该Delegate
类型的方法。
有趣的是,例如 Microsoft 的 PRISM 库可以从可移植类库中调用“Delegate.CreateDelegate”。它在DelegateReference
课堂上这样做。PRISM 可移植类库面向 .NET 4.0、Windows 8 应用商店应用、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
成员?预先感谢您的帮助!
在 Henk Holterman 回答后编辑:
GetMethodInfo() 是 PCL 子集支持的扩展方法。无论如何,这与我不能调用Delegate.CreateDelegate
而 PRISM 的 PCL 项目可以调用的问题无关。
Hans Passants 评论后的编辑 2 :
我只是玩了一下,发现当我激活 Silverlight 5 作为可移植库的目标时,Delegate.CreateDelegate
确实可以访问(并且 GetMethodInfo 扩展方法不再是)。那么可能会在Delegate.CreateDelegate
内部映射到 Windows 8 Store 和 Phone 应用程序的另一个 API?这是我能想到的唯一方法,因为我将 Silverlight 5 添加为有效目标,所以突然可以访问此方法。
(您可以通过右键单击“MyPortableClassLibrary”项目来重现此内容,单击“Properties”并在“Library”选项卡中单击更改以选择可移植库所针对的框架。)
另外,今天早些时候,我创建了一个 Windows Store App 项目,发现.NET 中CreateDelegate
的类上没有为 Windows 运行时定义方法。Delegate
在我的实际项目中,我不想在使用IObservable<T>
并IObserver<T>
大量使用 Rx 时以 Silverlight 5 为目标,并且这些接口在 Silverlight 中没有定义。