我希望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;发布于 2011-01-19 10:38:42
试着使用下面的代码:
empNumberProperty.SetValue(employee, employeeNumber, null);问题是SetValue的第一个参数是您试图修改的对象。
在查看MSDN Documentation时,我还注意到,如果“有非法尝试访问类中的私有或受保护的方法”,则此方法可能会抛出MethodAccessException,这似乎适用于这种情况。在备注部分中,将显示以下通知:
从.NET框架2.0版Service Pack1开始,如果调用方已被授予带有ReflectionPermissionFlag.RestrictedMemberAccess标志的ReflectionPermission,并且非公共成员的授权集仅限于调用方的授权集或其子集,则可以使用此方法访问非公共成员。要使用此功能,您的应用程序应面向.NET框架3.5版或更高版本。
或者,您可以尝试使用GetSetMethod(bool),但这仍然会受到相同的安全限制。
empNumberProperty.GetSetMethod(true).Invoke(employee, new[] { employeeNumber });发布于 2011-01-19 10:37:28
empNumberProperty.SetValue(empNumberProperty, employeeNumber, null);应该是
empNumberProperty.SetValue(employee, employeeNumber, null);https://stackoverflow.com/questions/4731186
复制相似问题