Reflection.TargetException问题

Ber*_*ryl 2 c# reflection

我希望仅由数据库设置Employee的EmployeeNumber属性,但是我需要能够设置单元测试的值。这就是为什么我在下面编写了辅助代码。

有人可以帮我解决和解决此问题吗?

干杯,
贝里

帮手代码

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);
    }
Run Code Online (Sandbox Code Playgroud)

完全例外

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()
Run Code Online (Sandbox Code Playgroud)

EmployeeNumber属性代码

    public virtual EmployeeNumber EmployeeNumber {
        get { return _employeeNumber; } 
        protected set {
            _employeeNumber = value;
            //base.BusinessId = _employeeNumber;
        }
    }
    private EmployeeNumber _employeeNumber;
Run Code Online (Sandbox Code Playgroud)

Wes*_*ser 5

尝试使用此代替:

empNumberProperty.SetValue(employee, employeeNumber, null);
Run Code Online (Sandbox Code Playgroud)

问题是SetValue的第一个参数是您尝试修改的对象。

在查看MSDN文档时,我还注意到,MethodAccessException如果“在类中有非法尝试访问私有或受保护方法的尝试” ,则此方法可能抛出,这似乎适用于这种情况。在备注部分中,此通知出现:

从.NET Framework 2.0 Service Pack 1开始,如果已使用ReflectionPermissionFlag.RestrictedMemberAccess标志为调用者授予了ReflectionPermission,并且将非公共成员的授予集限制为该方法,则可以使用此方法访问非公共成员。呼叫者的授予集或其子集。若要使用此功能,您的应用程序应针对.NET Framework 3.5或更高版本。

或者,您可以尝试使用GetSetMethod(bool),但是仍然会受到相同的安全性限制。

empNumberProperty.GetSetMethod(true).Invoke(employee, new[] { employeeNumber });
Run Code Online (Sandbox Code Playgroud)