3

最近、WP7アプリでこのようなことをしようとしていました

授業がある

abstract class A {
//this method has an implementation
protected void DoSomething<T, TKey>(Func<T, TKey> func) { //impl here }
};

そして、派生クラスのリフレクションを介してその保護されたメソッドを呼び出したいと思います。

    public class B : A {
      void SomeMethod(Type tableType, PropertyInfo keyProperty){ 
        MethodInfo mi = this.GetType()
                .GetMethod("DoSomething", BindingFlags.Instance | BindingFlags.NonPublic)
                .MakeGenericMethod(new Type[] { tableType, keyProperty.GetType() });

            LambdaExpression lambda = BuildFuncExpression(tableType, keyProperty);
// MethodAccessException
            mi.Invoke(this, new object[] { lambda });
        }

        private System.Linq.Expressions.LambdaExpression BuildFuncExpression(Type paramType, PropertyInfo keyProperty)
        {
            ParameterExpression parameter = System.Linq.Expressions.Expression.Parameter(paramType, "x");
            MemberExpression member = System.Linq.Expressions.Expression.Property(parameter, keyProperty);
            return System.Linq.Expressions.Expression.Lambda(member, parameter);
        }


}
    };

そして、MethodAccessExceptionが発生します。これはセキュリティ上の例外であることは理解していますが、その場所から通常どおりメソッドを呼び出すことができるので、リフレクションを介して呼び出すこともできるはずです。

何が悪いのでしょうか?ありがとう!

4

1 に答える 1

4

http://msdn.microsoft.com/en-us/library/system.methodaccessexception.aspxから

この例外は、次のような状況でスローされます。

  • 通常のコンパイル済みコードからはアクセスできないプライベート、保護、または内部メソッドは、リフレクションを使用して部分的に信頼されたコードからアクセスされます。

  • セキュリティが重要なメソッドは、透過的なコードからアクセスされます。

  • クラスライブラリのメソッドのアクセスレベルが変更され、ライブラリを参照する1つ以上のアセンブリが再コンパイルされていません。

WP7内では、このリフレクションコードがプライベート(非パブリック)メソッドにアクセスしようとすることが問題である可能性が最も高いと思います。WP7は、このタイプのアクセスを防ぐためにロックダウンされていることを非常に明確にしています。

于 2011-03-10T09:11:55.730 に答える