如何动态调用属性,但仅当其参数是某种类型时?

时间:2010-10-12 18:32:36

标签: c# reflection

我正在尝试使用反射来获取我的POCO中的所有(可设置)属性(现在采用字符串参数,但我计划扩展到其他类型),并将它们设置为任意的。 (我需要确保正确实现.Equals方法。)

我的单元测试中有一些代码看起来像这样(其中t是被测对象,你是该对象的默认版本):

foreach(var property in t.GetType().GetProperties())
{
    var setMethod = property.GetSetMethod();
    var type = setMethod.GetParameters()[0].GetType();
    if(typeof(string).IsAssignableFrom(type))
    {
        setMethod.Invoke(t, new object[] {"a"});
        Assert.IsFalse(t.Equals(u));
        Assert.IsFalse(t.GetHashCode() == u.GetHashCode());
    }                    
}

失败的地方是我说typeof(string).IsAssignableFrom(type)的地方。 if { ... }块中的代码永远不会运行。我如何正确编写测试的这一部分?

1 个答案:

答案 0 :(得分:4)

您将ParameterInfo.GetType()ParameterInfo.ParameterType混为一谈。你应该:

var type = setMethod.GetParameters()[0].ParameterType;

.GetType()返回当前对象的类型,在本例中为ParameterInfo,这显然不是您想要的。