Объект не соответствует целевому типу PropertyInfo SetValue - один класс другому

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


person CularBytes    schedule 09.12.2014    source источник


Ответы (1)


  • вы просто выполняете .Zip два списка объектов PropertyInfo, которые просто перебирают оба списка и не проверяют и не сортируют совпадения. Это может привести к ошибочному поведению в зависимости от порядка отображения свойств — рассмотрите возможность использования .Join для соответствия именам свойств.
  • Этот код не проверяет индексатор свойства перед попыткой присвоить ему значение без такового — любое индексированное свойство типа string дойдет до этой точки, а затем выдаст исключение, когда вы попытаетесь его установить.
  • Поскольку этот код обращается к Свойствам, существует вероятность, что создается исключение. выбрасывается кодом самого свойства. Именно здесь StackTrace из вашего исключения может рассказать гораздо больше о том, что происходит.
  • Ваш код также проверяет свойство типа string напрямую — при использовании отражения вы должны использовать IsAssignableFrom, чтобы разрешить унаследованные типы, хотя в данном случае это вряд ли проблема.
person David    schedule 09.12.2014
comment
Я проверю метод соединения завтра, похоже, это хорошее решение, если оно сработает, я дам ответ, если кто-то еще не будет достаточно быстр тем временем. - person CularBytes; 10.12.2014