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

在以下情况下会引发此异常:

  • 通过使用反射从部分受信任的代码访问无法从正常编译代码访问的私有、受保护或内部方法。

  • 从透明代码访问安全关键方法。

  • 类库中方法的访问级别已更改,并且引用该库的一个或多个程序集尚未重新编译。

在 WP7 中,我认为问题最有可能是这个反射代码试图访问私有(非公共)方法——而 WP7 已经非常清楚它被锁定以防止这种类型的访问。

于 2011-03-10T09:11:55.730 回答