首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Reflection.TargetException问题

Reflection.TargetException问题
EN

Stack Overflow用户
提问于 2011-01-19 10:24:53
回答 2查看 16.6K关注 0票数 2

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

有没有人能帮我排查和解决这个问题?

干杯,

Berryl

帮助程序代码

代码语言:javascript
运行
复制
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);
    }

完全例外

代码语言:javascript
运行
复制
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属性代码

代码语言:javascript
运行
复制
    public virtual EmployeeNumber EmployeeNumber {
        get { return _employeeNumber; } 
        protected set {
            _employeeNumber = value;
            //base.BusinessId = _employeeNumber;
        }
    }
    private EmployeeNumber _employeeNumber;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-19 10:38:42

试着使用下面的代码:

代码语言:javascript
运行
复制
empNumberProperty.SetValue(employee, employeeNumber, null);

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

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

从.NET框架2.0版Service Pack1开始,如果调用方已被授予带有ReflectionPermissionFlag.RestrictedMemberAccess标志的ReflectionPermission,并且非公共成员的授权集仅限于调用方的授权集或其子集,则可以使用此方法访问非公共成员。要使用此功能,您的应用程序应面向.NET框架3.5版或更高版本。

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

代码语言:javascript
运行
复制
empNumberProperty.GetSetMethod(true).Invoke(employee, new[] { employeeNumber });
票数 5
EN

Stack Overflow用户

发布于 2011-01-19 10:37:28

代码语言:javascript
运行
复制
empNumberProperty.SetValue(empNumberProperty, employeeNumber, null);

应该是

代码语言:javascript
运行
复制
 empNumberProperty.SetValue(employee, employeeNumber, null);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4731186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档