2009-04-16 21 views
14

State utilizzando un metodo Copia con questo codice in varie posizioni nei progetti precedenti (per gestire oggetti che hanno le stesse proprietà ma che non derivano da un comune classe base o implementare un'interfaccia comune).SetValue sull'errore di istanza PropertyInfo "L'oggetto non corrisponde al tipo di destinazione" C#

nuovo posto di lavoro, nuovo codebase - ora è mancato al ImpostaValore con "L'oggetto non corrisponde tipo di target" esempi anche su molto semplici ... e ha funzionato la settimana scorsa ....

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

    } 

Speriamo che qualcuno possa indicarmi dove sono stupido ???

risposta

17

Prova:

toProperty.SetValue(toObj,fromValue,null); 

si sta cercando di passare nella proprietà (toProperty) come oggetto di destinazione, invece di toObj. Per informazioni, se si sta facendo molto questo, prendere in considerazione HyperDescriptor, che può ridurre notevolmente i costi di riflessione.

+0

D'oh! questo è l'errore che ho risolto l'ULTIMA volta in cui l'ho scritto - e ho dimenticato di controllare questa volta ... – kpollock

10

Dovrebbe essere

toProperty.SetValue(toObj,fromValue,null); 
+4

Troppo lento, immagino .. –

Problemi correlati