Вызовите защищенный универсальный метод через .NET отражение в производном классе - PullRequest
3 голосов
/ 10 марта 2011

недавно я пытался сделать что-то подобное в приложении 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.Я понимаю, что это исключение безопасности, но я могу нормально вызывать метод из этого места, поэтому я также должен вызывать его с помощью отражения.

Что может быть не так?Спасибо!

1 Ответ

4 голосов
/ 10 марта 2011

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

Это исключение возникает в следующих ситуациях:

  • Частный, защищенный или внутренний метод, который небыть доступным из обычного скомпилированного кода, доступ осуществляется из частично доверенного кода с использованием отражения.

  • Доступ к критическому методу безопасности осуществляется из прозрачного кода.

  • Уровень доступа метода в библиотеке классов изменился, и одна или несколько сборок, которые ссылаются на библиотеку, не были перекомпилированы.

В WP7, я думаю, проблемаСкорее всего, этот код отражения пытается получить доступ к закрытым (не общедоступным) методам - ​​и WP7 очень четко определил, что он заблокирован для предотвращения доступа такого типа.

...