Domanda

Sto ottenendo "L'oggetto non corrisponde al tipo di destinazione" quando provo a recuperare il valore di un oggetto in fase di esecuzione nel mio programma C#.

public void GetMyProperties(object obj)
{
  foreach(PropertyInfo pinfo in obj.GetType().GetProperties())
  {
    if(!Helper.IsCustomType(pinfo.PropertyType))
    {
      string s = pinfo.GetValue(obj, null); //throws error during recursion call
      propArray.Add(s);
    }
    else
    {
      object o = pinfo.PropertyType;
      GetMyProperties(o);
    }
  }
}

Passo un oggetto del mio brokerInfo di classe che ha una proprietà di Type Broker che Intern ha proprietà - FirstName e LastName (tutte le stringhe per semplicità).

- BrokerInfo
  - Broker
    - FirstName
    - LastName

Sto cercando di controllare ricorsivamente i tipi personalizzati e sto cercando di ottenere i loro valori. Sono in grado di fare per qualcosa di simile:

- Broker
  - FirstName
  - LastName

Per favore aiuto.

Aggiornamento: è stato in grado di risolverlo con l'aiuto di Leppie: ecco il codice modificato.

public void GetMyProperties(object obj)
{
  foreach(PropertyInfo pinfo in obj.GetType().GetProperties())
  {
    if(!Helper.IsCustomType(pinfo.PropertyType))
    {
      string s = pinfo.GetValue(obj, null); 
      propArray.Add(s);
    }
    else
    {
      object o = pinfo.GetValue(obj, null);
      GetMyProperties(o);
    }
  }
}

IScustom è il mio metodo per verificare se il tipo è di tipo Custome o meno. Ecco il codice:

public static bool IsCustomType(Type type)
{
    //Check for premitive, enum and string
    if (!type.IsPrimitive && !type.IsEnum && type != typeof(string))
    {
        return true;
    }
    return false;
}
È stato utile?

Soluzione

Perché stai perforando il tipo, anziché l'istanza?

Specificamente qui:

  object o = pinfo.PropertyType;
  GetMyProperties(o);

Dovrebbe sembrare qualcosa di simile:

  var o = pinfo.GetValue(obj, null);
  GetMyProperties(o);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top