2012-03-07 3 views
0

Je suis un débutant quand il s'agit de réflexion et pour le moment tout cela me semble plutôt déroutant alors pardonnez-moi si certaines de vos réponses semblent me confondre un peu plus !!!C# Erreur de réflexion

Je suis actuellement en train d'essayer d'écrire un petit script qui va cloner les données contenues dans une table de données en fonction d'une valeur, puis réinsérer ces données dans la même table, mais avec un ID modifié. J'essaie actuellement d'utiliser la réflexion car j'ai besoin de faire cela pour plusieurs tables et je ne souhaite pas trop de clauses pour un nombre incalculable de tables.

Le code que je l'ai écrit jusqu'à présent pour la méthode de réflexion est la suivante:

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); 
     } 
    } 
} 

Maintenant, j'ai actuellement aucun problème passer les données dont j'ai besoin dans cette classe, mais je reçois jeté l'erreur suivante: Je crois que cela avait à voir avec les champs entiers utilisés pour identifier les liens dans les données. Il est important que je garde ces intacts pour le traitement plus tard sur la ligne.

Quelqu'un peut-il s'il vous plaît me pointer dans la bonne direction d'un moyen de résoudre ce problème ????

Un grand merci

Répondre

2

je suppose que l'erreur est jeté sur cette ligne:

targetPropertyInfo.SetValue(targetObject, value, null); 

Dans cette ligne value est un tableau d'objets. Je suppose que ce devrait être un int32. Voulez-vous réellement faire ceci:

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

Cela écrirait la valeur que vous venez de sortir de l'autre objet.

+0

A travaillé parfait merci beaucoup! – Callum

+0

@ Callum: Juste pour vous aider avec vos compétences de débogage une fois que cette erreur est apparue, vous auriez dû vérifier la ligne vers laquelle il pointait et ensuite réfléchir sérieusement sur les types impliqués. 'value' est le seul objet de type' object [] 'de sorte que vous pouvez dire que c'était votre coupable et à partir de là vous auriez probablement remarqué votre erreur. Dans ce cas, 'value' n'a pas vraiment besoin d'être un tableau' object' bien que j'apprécie que vous ayez un autre code que vous avez élagué pour cette question qui utilise le tableau (et en fait 'param' qui n'est pas utilisé). – Chris