对象与目标类型PropertyInfo SetValue不匹配 - 一个类到另一个类

时间:2014-12-09 20:38:18

标签: c# reflection types propertyinfo setvalue

所以我有2个类,两个都有相同的属性名。一个类包含不同的变量:intstringsboolDateTime第二个类只包含1个int,其余的都是字符串。

现在我想循环遍历所有属性,从class1获取值,加密该数据并将其保存为obj2中的字符串,然后将其返回到主窗体(稍后将其保存在数据库中)。

public PersoonEncrypted EncryptPersonClass(Class1 object1)
    {
        PersoonEncrypted persEncrypt = new PersoonEncrypted(); //second class obj

        Type type = object1.GetType();
        PropertyInfo[] properties = type.GetProperties();
        Type type2 = persEncrypt.GetType();
        PropertyInfo[] properties2 = type.GetProperties();
        foreach (var bothProperties in properties.Zip(properties2, (obj1, obj2) => new { Obj1 = obj1, Obj2 = obj2 }))
        {
            string value = "";

            value = bothProperties.Obj1.GetValue(object1) as string;
            if (!string.IsNullOrWhiteSpace(value))
            {
                string encryptValue = Encrypt(value);
                if ((bothProperties.Obj2 != null) && (bothProperties.Obj2.PropertyType == typeof(string)))
                { //!= null check has no effect at all
                    bothProperties.Obj2.SetValue(persEncrypt, encryptValue, null); //errorLine
                }
            }

        }

        return persEncrypt;
    }

这就是我想到的。 当然,我已经搜索了其他解决方案like this one。这在应用了一些自己的更改后,没有返回任何错误,但它没有将任何加密的字符串保存到类persEncrypt中。我得出的结论是,从该测试来看,它正在测试来自特定属性的第二类(我的示例中为persEncrypt)中的值是否为null,而它不应该这样做,它应该是该变量的新实例并将其保存在对象类中,但删除该检查会给我带来同样的错误。

1 个答案:

答案 0 :(得分:1)

  • 您只是.Zip - 两个PropertyInfo对象列表,它们只是遍历两个列表,并且不会检查或排序任何类型的匹配。这可能会导致错误的行为,具体取决于属性的显示顺序 - 请考虑使用.Join来匹配属性名称。
  • 此代码在尝试分配给它之前没有检查属性上的索引器 - 任何类型为string的索引属性都将使其达到此点然后在异常时抛出异常你试着设置它。
  • 因为此代码正在调用Properties,所以可能会由Property本身的代码抛出异常。这是您的例外中的StackTrace可以更多地了解发生了什么。
  • 您的代码还会直接检查类型string的属性 - 在使用反射时,您应该使用IsAssignableFrom代替以允许继承类型,尽管在这种情况下这不太可能是问题。