对象与目标类型 PropertyInfo SetValue 不匹配 - 一个类到另一个类
本文关键字:一个 另一个 目标 类型 PropertyInfo 不匹配 SetValue 对象 | 更新日期: 2023-09-27 18:33:48
所以我有 2 个类,它们都具有相同的属性名称。一个类包含不同的变量:int
、strings
、bool
和DateTime
第二个类只包含 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;
}
这就是我直到现在才想到的。当然,我已经搜索了其他类似的解决方案。在应用了一些自己的更改后,这没有返回任何错误,但它没有将任何加密字符串保存到类persEncrypt
中。从该测试中,我得出的结论是,它正在测试特定属性的第二个类(在我的示例中persEncrypt
(中的值是否为 null,虽然它不应该这样做,但它应该创建该变量的新实例并将其保存在对象类中,但删除该检查给了我同样的错误。
- 您只是
.Zip
PropertyInfo 对象的两个列表,它只是遍历两个列表,并且不检查或排序任何类型的匹配。这可能会导致错误行为,具体取决于属性的显示顺序 - 请考虑改用.Join
来匹配属性名称。 - 此代码在尝试在没有索引器的情况下分配给属性之前不会检查属性上的索引器 - 任何类型为
string
的索引属性都将达到这一点,然后在尝试设置它时引发异常。 - 由于此代码正在调用属性,因此属性本身的代码可能会引发异常。这就是来自异常的 StackTrace 可以揭示更多关于正在发生的事情的地方。
- 您的代码还直接检查类型
string
的属性 - 使用反射时,应改用IsAssignableFrom
以允许继承的类型,尽管这在这种情况下不太可能成为问题。