次の問題があります: .NET 4.5、Windows Phone 8、および Windows 8 ストア アプリを対象とするポータブル クラス ライブラリ内から呼び出したいのですDelegate.CreateDelegate
が、コードがコンパイルされません。コンパイラは、型のメソッドが見つからないと言いますDelegate
。
おもしろいことに、たとえば Microsoft の PRISM ライブラリは、Portable Class Library から「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
DelegateReference
これには、私のライブラリ プロジェクトと、クラスとそのインターフェイスのみを含む PRISM PubSubEvents プロジェクトの非常に簡素化されたバージョンが含まれています。後者の完全なソース コードは、http: //prismwindowsruntime.codeplex.com/SourceControl/latestにあります。
Delegate
すべてのメンバーを使用するにはどうすればよいですか? よろしくお願いします。
Henk Holtermanの答えの後に編集:
GetMethodInfo() は、PCL サブセットでサポートされている拡張メソッドです。Delegate.CreateDelegate
とにかく、それは、PRISM の PCL プロジェクトでは呼び出せるのに、私が呼び出せないという問題とは関係ありません。
Hans Passantsのコメントの後のEDIT 2 :
いろいろ試してみたところ、Silverlight 5 をポータブル ライブラリのターゲットとして有効にすると、実際にアクセスできることがわかりましたDelegate.CreateDelegate
(そして、GetMethodInfo 拡張メソッドはアクセスできなくなりました)。Delegate.CreateDelegate
内部で Windows 8 ストアおよび電話アプリ用の別の API にマップされている可能性がありますか? Silverlight 5 を有効なターゲットとして追加したという理由だけで、このメソッドが突然アクセス可能になると考えることができる唯一の方法です。
(これを再現するには、「MyPortableClassLibrary」プロジェクトを右クリックし、「プロパティ」をクリックし、「ライブラリ」タブで変更をクリックして、ポータブル ライブラリの対象となるフレームワークを選択します。)
また、本日、Windows ストア アプリ プロジェクトを作成したところ、.NET のクラスに Windows ランタイム用のCreateDelegate
メソッドが定義されていないことがわかりました。Delegate
私の実際のプロジェクトでは、Silverlight 5 をターゲットにしたくありません。Rx を使用IObservable<T>
しIObserver<T>
ており、これらのインターフェイスが Silverlight で定義されていないためです。