我希望仅由数据库设置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)
public virtual EmployeeNumber EmployeeNumber {
get { return _employeeNumber; }
protected set {
_employeeNumber = value;
//base.BusinessId = _employeeNumber;
}
}
private EmployeeNumber _employeeNumber;
Run Code Online (Sandbox Code Playgroud)
尝试使用此代替:
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)
| 归档时间: |
|
| 查看次数: |
15474 次 |
| 最近记录: |