我有以下问题:我想打电话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 项目可以。
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 中定义。