2012-03-07 2 views
0

Я новичок, когда дело доходит до размышлений, и на данный момент все это кажется довольно запутанным, так что простите меня, если некоторые из ваших ответов кажутся запутавшими меня немного больше !!!C# Ошибка отражения

В настоящее время я пытаюсь написать небольшой скрипт, который будет клонировать данные, хранящиеся в одной таблице данных, на основе значения, а затем повторно вставлять указанные данные в одну и ту же таблицу, хотя и с измененным идентификатором. В настоящее время я пытаюсь использовать рефлексию, поскольку мне нужно сделать это для нескольких таблиц и не хочу кодировать избыточное количество предложений для бесчисленного количества таблиц.

Кодекса я написал до сих пор для метода отражения заключается в следующем:

public static void CopyData(object sourceObject, object targetObject) 
{ 
    object[] value = new object[1]; 
    object[] param = new object[0]; 

    foreach (PropertyInfo propertyInfo in sourceObject.GetType().GetProperties()) 
    { 
     PropertyInfo targetPropertyInfo = targetObject.GetType().GetProperty(propertyInfo.Name); 
     if (targetPropertyInfo.CanWrite && targetPropertyInfo.CanRead) 
     { 
      value[0] = propertyInfo.GetValue(sourceObject, BindingFlags.Public, null, null, null); 
      targetPropertyInfo.SetValue(targetObject, value, null); 
     } 
    } 
} 

Сейчас я в настоящее время нет никаких проблем проходящих данных мне нужно в этот класс, ОДНАКО я получаю выброшена следующее сообщение об ошибке:

Object of type 'System.Object[]' cannot be converted to type 'System.Int32'. 

Я считаю, что это связано с полями Integer, используемыми для идентификации ссылок внутри данных. Важно, чтобы я сохранил эти неповрежденные для обработки позже строки.

Может ли кто-нибудь указать мне в правильном направлении пути решения этой проблемы ????

Большое спасибо

ответ

2

Я предполагаю, что ошибка возникает на этой линии:

targetPropertyInfo.SetValue(targetObject, value, null); 

В этой строке value является массивом объектов. Я предполагаю, что это должен быть int32. Вы действительно хотите сделать это:

targetPropertyInfo.SetValue(targetObject, value[0], null); 

Это будет запись значения, которое вы только что выбрали из другого объекта.

+0

Работал отлично, большое спасибо! – Callum

+0

@Callum: просто чтобы помочь с вашими навыками отладки, как только эта ошибка возникла, вы должны были проверить линию, на которую она указывала, и затем подумали, что это за типы. 'value' является единственным объектом такого типа' object [] ', поэтому вы можете сказать, что это был ваш преступник, и с этого момента вы, вероятно, заметили бы свою ошибку. В этом случае 'value' не обязательно должен быть массивом' object', хотя я бы предпочел, чтобы у вас был другой код, который вы обрезали для этого вопроса, который использует массив (и даже 'param', который не используется). – Chris

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