11

デスクトップ、Windows 8 ストア、および Windows phone 用の新しいアプリケーションを同時に構築しています。そこで、すべてのプラットフォームで共通の機能を持つポータブル クラス ライブラリを作成しました。私の問題は、PCL 内でコードを再利用しようとすると、ライブラリ内のいくつかのメソッドとプロパティにアクセスできないことです。MSDN によると、これらのメソッドはサポートされていますが、アクセスできない理由がわかりました。

        var property = memberExpression.Member as PropertyInfo;
        if (property == null)
        {
        }

        var getMethod = property.GetGetMethod(true);
        if (getMethod.IsStatic)
        {}

これは、コンパイルできないコードの断片です。GetGetMethod と IsStatic は、Visual Studio エディター内で赤字になっています。なぜそれが起こっているのか、それらのプロパティにアクセスする方法はわかりません。

誰かがそのようなことをしたことがあるなら、このコードをコンパイルするのを手伝ってください。

4

2 に答える 2

18

.NETforWindowsストアアプリのリフレクションAPIでいくつかのリファクタリングを行いました。詳細については、ブログ投稿「EvolveingtheReflectionAPI 」を参照してください。特に、APIの変更により、将来の移植性が向上するように設定されています。新しいAPIは、Windowsストアアプリ、.NET4.5およびWindowsPhone 8で使用できます。互換性のために、古いAPIはもちろん.NET4.5およびWindowsPhone8でも使用できます。

ポータブルクラスライブラリの場合、新しいリフレクションAPIがサポートされているプラ​​ットフォームのみをターゲットにすると、新しいAPIのみが取得されます。新しいAPIをサポートしないプラットフォームを追加すると、APIを取得できます。

PropertyInfo.GetGetMethod()は新しいAPIの一部ではないため、代わりに使用する必要がありますPropertyInfo.GetMethodMethodInfo.IsStaticは新しいAPIの一部です。これは、Visual Studioで赤い波線が表示された理由は、使用したためにgetMethodのタイプがわからずvar、GetGetMethod()が認識されなかったためです。

したがって、コードは次のようになります。

    var property = memberExpression.Member as PropertyInfo;
    if (property == null)
    {
    }

    var getMethod = property.GetMethod;
    if (getMethod != null && getMethod.IsStatic)
    {}
于 2012-12-28T01:05:21.470 に答える
0

私のコメントに関する情報を提供するには、Type.GetMethod を使用します

タイプからのメタデータ

メソッドとプロパティから返されたメタデータを評価する場合System.Type、等値演算子はプラットフォームごとに異なる結果を返す場合があります。.NET Compact Framework では、Type.GetMethodメソッドを連続して呼び出すたびに の新しいインスタンスが返される System.Reflection.MethodInfoため、戻り値が等しいと評価されることはありません。ただし、.NET Framework 4 ではGetMethod、同じパラメーターを使用して呼び出すと、MethodInfo の同じインスタンスが返されます。MethodInfoSystem.Reflection タイプ、FieldInfoPropertyInfoEventInfoMemberInfoMethodBaseConstructorInfoおよび を使用している場合は、コードを確認し、必要に応じて変更する必要がありますParameterInfo

オープン ジェネリック型の考察

Windows Phone 7 では、クローズ ジェネリック型でリフレクションがサポートされています。ただし、ほとんどのリフレクション操作は、オープン ジェネリック型ではサポートされていません。オープン ジェネリック型では、次のリフレクション操作のみが Windows Phone 7 でサポートされています。 or メソッドを呼び出してオープン ジェネリック型またはメソッドを取得GetTypeするGetMethodsMakeGenericTypeまたはメソッドを呼び出して、開いているジェネリック型またはメソッドからジェネリック型またはメソッドを作成し MakeGenericMethodます。オープン ジェネリック型に対する他のすべてのリフレクション操作では、NotSupportedException例外がスローされます。

ソース: http://msdn.microsoft.com/en-us/library/gg597392.aspx

于 2012-12-27T21:12:56.893 に答える