SetValue en cas d'erreur d'instance PropertyInfo « L'objet ne correspond pas au type de cible » c #

StackOverflow https://stackoverflow.com/questions/755646

  •  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 ???

Était-ce utile?

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top