2014-12-09 2 views
0

Итак, у меня есть 2 класса, оба имеют одинаковые имена свойств. Один класс содержит разные переменные: int, strings, bool и DateTime Второй класс содержит только 1 int, а остальное все строки.Объект не соответствует типу цели PropertyInfo SetValue - один класс другому

Теперь я хочу перебрать все свойства, получить значение из класса 1, зашифровать эти данные и сохранить его как строку в 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 в моем примере) из определенного свойства равным нулю, в то время как оно не должно этого делать, оно должно создать новый экземпляр этого переменную и сохранить ее в классе объекта, но удаление этой проверки дало мне ту же ошибку.

ответ

1
  • вы просто .Zip -ную два списка объектов PropertyInfo, которые просто итерацию по обоим спискам и не проверяет, или сортировки для любого рода совпадения. Это может привести к ошибочному поведению в зависимости от порядка, в котором появляются свойства, - вместо этого используйте .Join для соответствия именам свойств.
  • Этот код не проверяет индексатор на свой ресурс, прежде чем пытаться назначить его без одного - любое индексированное свойство, которое имеет тип string, перейдет к этой точке, а затем выбросит исключение при попытке установить его.
  • Поскольку этот код вызывает Properties, существует вероятность того, что исключение будет вызывать код самого свойства. Именно здесь StackTrace из вашего исключения может больше узнать о том, что происходит.
  • Ваш код также проверяет свойство типа string непосредственно - при использовании отражения вместо этого вы должны использовать IsAssignableFrom, чтобы разрешить наследованные типы, хотя это вряд ли проблема в этом случае.
+0

Я проверю метод соединения завтра, выглядит как хорошее решение, если оно работает, чем я предоставил ответ, если кто-то еще не достаточно быстро за это время. – CularBytes

Смежные вопросы