SetValue en cas d'erreur d'instance PropertyInfo « L'objet ne correspond pas au type de cible » c #
-
09-09-2019 - |
Question
utilise une méthode de copie avec ce code dans divers endroits dans les projets précédents (pour traiter les objets qui ont les mêmes propriétés nommées mais ne dérivent pas d'une classe de base commune ou implémentent une interface commune).
Nouveau lieu de travail, le nouveau code de base - maintenant il ne l'SetValue avec « l'objet ne correspond pas au type de cible » même des exemples très simples sur ... et cela a fonctionné la semaine dernière ....
public static void Copy(object fromObj, object toObj)
{
Type fromObjectType = fromObj.GetType();
Type toObjectType = toObj.GetType();
foreach (System.Reflection.PropertyInfo fromProperty in
fromObjectType.GetProperties())
{
if (fromProperty.CanRead)
{
string propertyName = fromProperty.Name;
Type propertyType = fromProperty.PropertyType;
System.Reflection.PropertyInfo toProperty =
toObjectType.GetProperty(propertyName);
Type toPropertyType = toProperty.PropertyType;
if (toProperty != null && toProperty.CanWrite)
{
object fromValue = fromProperty.GetValue(fromObj,null);
toProperty.SetValue(toProperty,fromValue,null);
}
}
}
}
private class test
{
private int val;
private string desc;
public int Val { get { return val; } set { val = value; } }
public string Desc { get { return desc; } set { desc = value; } }
}
private void TestIt()
{
test testo = new test();
testo.Val = 2;
testo.Desc = "TWO";
test g = new test();
Copy(testo,g);
}
Espérons que quelqu'un peut indiquer où je suis être débile ???
La solution
Essayez:
toProperty.SetValue(toObj,fromValue,null);
Vous essayez de passer dans la propriété (toProperty
) comme l'objet cible, au lieu de toObj
. Pour info, si vous faites beaucoup de cela, peut-être envisager HyperDescriptor , ce qui peut considérablement réduire le coût de la réflexion.
Autres conseils
doit être
toProperty.SetValue(toObj,fromValue,null);