Reflection.TargetException问题

时间:2011-01-19 02:24:53

标签: c# reflection

我希望Employee的EmployeeNumber属性只能由数据库设置,但我需要能够设置单元测试的值。这就是我在下面制作帮助代码的原因。

有人可以帮我解决问题吗?解决这个问题?

干杯,
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 个答案:

答案 0 :(得分:4)

请尝试使用此代码:

empNumberProperty.SetValue(employee, employeeNumber, null);

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

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

  

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

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

empNumberProperty.GetSetMethod(true).Invoke(employee, new[] { employeeNumber });

答案 1 :(得分:2)

empNumberProperty.SetValue(empNumberProperty, employeeNumber, null);

应该是

 empNumberProperty.SetValue(employee, employeeNumber, null);