我有一个问题:我想从我的可移植类库中调用 Delegate.CreateDelegate 方法,该类库针对 .NET 4.5、Windows Phone 8 和 Windows 8 Store 应用程序,但我的代码无法编译。编译器说它找不到 Delegate 类上的方法。
有趣的是,例如微软的 PRISM 库可以从可移植类库中调用“Delegate.CreateDelegate”方法。 它在 DelegateReference 类中执行此操作。 PRISM 可移植类库的目标是 .NET 4.0、Windows 8 Store 应用程序、Windows Phone 8 和 Silverlight 5(因此更为严格)。
无法编译的代码如下:
这里可以下载一个示例:https://dl.dropboxusercontent.com/u/14810011/PortableClassLibraryReferenceProblem.zip,其中包含我的库项目和PRISM PubSubEvents项目的一个非常简化的版本,只包含DelegateReference类及其接口。后者的完整源代码可以在此处找到:http://prismwindowsruntime.codeplex.com/SourceControl/latest。我该怎么做才能使用所有委托成员?提前感谢您的帮助!
Henk Holterman的回答后进行了编辑:
GetMethodInfo()是由PCL子集支持的扩展方法。无论如何,这与我无法调用Delegate.CreateDelegate没有关系,而PRISM的PCL项目可以。
Hans Passants评论后进行了第二次编辑:
我刚刚玩了一下,发现当我将Silverlight 5作为可移植库的目标激活时,确实可以访问Delegate.CreateDelegate(而GetMethodInfo扩展方法不再可用)。那么,Delegate.CreateDelegate是否在内部映射到另一个Windows 8 Store和Phone应用程序的API呢?这是我能想到的唯一方式,即通过添加Silverlight 5作为有效目标来突然访问此方法。
(您可以通过右键单击“MyPortableClassLibrary”项目,单击“属性”,然后在“库”选项卡中单击更改以选择可移植库所针对的框架来重现此操作。)
另外,今天早些时候,我创建了一个Windows Store应用程序项目,并发现在.NET for Windows Runtime的Delegate类上没有定义CreateDelegate方法。
在我的实际项目中,我不想将Silverlight 5作为目标,因为我使用Rx大量使用IObservable和IObserver这些接口在Silverlight中未定义。
有趣的是,例如微软的 PRISM 库可以从可移植类库中调用“Delegate.CreateDelegate”方法。 它在 DelegateReference 类中执行此操作。 PRISM 可移植类库的目标是 .NET 4.0、Windows 8 Store 应用程序、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。我该怎么做才能使用所有委托成员?提前感谢您的帮助!
Henk Holterman的回答后进行了编辑:
GetMethodInfo()是由PCL子集支持的扩展方法。无论如何,这与我无法调用Delegate.CreateDelegate没有关系,而PRISM的PCL项目可以。
Hans Passants评论后进行了第二次编辑:
我刚刚玩了一下,发现当我将Silverlight 5作为可移植库的目标激活时,确实可以访问Delegate.CreateDelegate(而GetMethodInfo扩展方法不再可用)。那么,Delegate.CreateDelegate是否在内部映射到另一个Windows 8 Store和Phone应用程序的API呢?这是我能想到的唯一方式,即通过添加Silverlight 5作为有效目标来突然访问此方法。
(您可以通过右键单击“MyPortableClassLibrary”项目,单击“属性”,然后在“库”选项卡中单击更改以选择可移植库所针对的框架来重现此操作。)
另外,今天早些时候,我创建了一个Windows Store应用程序项目,并发现在.NET for Windows Runtime的Delegate类上没有定义CreateDelegate方法。
在我的实际项目中,我不想将Silverlight 5作为目标,因为我使用Rx大量使用IObservable和IObserver这些接口在Silverlight中未定义。