最近、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が発生します。これはセキュリティ上の例外であることは理解していますが、その場所から通常どおりメソッドを呼び出すことができるので、リフレクションを介して呼び出すこともできるはずです。
何が悪いのでしょうか?ありがとう!