Проблема Reflection.TargetException - PullRequest
       0

Проблема Reflection.TargetException

2 голосов
/ 19 января 2011

Я хочу, чтобы свойство EmployeeNumber для Employee задавалось только базой данных, но мне нужно иметь возможность установить значение для модульного тестирования. Вот почему я сделал код помощника ниже.

Может ли кто-нибудь помочь мне решить проблему и исправить это?

Приветствия
Berryl

Код помощника

public static void SetEmployeeNumberFor(Employee employee, EmployeeNumber employeeNumber)
    {
        var empNumberProperty = employee.GetType().GetProperty("EmployeeNumber", BindingFlags.Public | BindingFlags.Instance);

        Check.Invariant(empNumberProperty != null);
        Check.Invariant(empNumberProperty.PropertyType.Equals(typeof(EmployeeNumber)));

        empNumberProperty.SetValue(empNumberProperty, employeeNumber, null);
    }

Полное исключение

System.Reflection.TargetException : Object does not match target type.
at System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, Object[] index)
TestableEmployee.cs(36,0): at Smack.ConstructionAdmin.TestingSupport.ResourceHelper.SetEmployeeNumberFor(Employee employee, EmployeeNumber employeeNumber)
TestableEmployee.cs(47,0): at Smack.ConstructionAdmin.TestingSupport.ResourceHelperTests.SetEmployeeNumberFor()

Код имущества EmployeeNumber

    public virtual EmployeeNumber EmployeeNumber {
        get { return _employeeNumber; } 
        protected set {
            _employeeNumber = value;
            //base.BusinessId = _employeeNumber;
        }
    }
    private EmployeeNumber _employeeNumber;

Ответы [ 2 ]

4 голосов
/ 19 января 2011

Попробуйте использовать это вместо:

empNumberProperty.SetValue(employee, employeeNumber, null);

Проблема в том, что первым параметром SetValue является объект, который вы пытаетесь изменить.

Просматривая документацию MSDN , я также заметил, что этот метод может выдавать MethodAccessException, если "была попытка доступа к закрытому или защищенному методу внутри класса", что выглядит как будет применяться в этой ситуации. В разделе замечаний появляется это уведомление:

Начиная с .NET Framework версии 2.0 с пакетом обновления 1 (SP1), этот метод можно использовать для доступа к закрытым членам, если вызывающему предоставлен ReflectionPermission с ReflectionPermissionFlag.RestrictedMemberAccess флаг и если набор разрешений непубличных участников ограничен набором разрешений вызывающей стороны или его подмножеством. Чтобы использовать эту функцию, ваше приложение должно предназначаться для .NET Framework версии 3.5 или более поздней.

В качестве альтернативы, вы можете попробовать использовать GetSetMethod(bool), но это все равно будет подвергаться тем же ограничениям безопасности.

empNumberProperty.GetSetMethod(true).Invoke(employee, new[] { employeeNumber });
2 голосов
/ 19 января 2011
empNumberProperty.SetValue(empNumberProperty, employeeNumber, null);

Должно быть

 empNumberProperty.SetValue(employee, employeeNumber, null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...