Stavo facendo qualcosa come Recursively Get Properties & Child Properties Of An Object, ma volevo usare la riflessione in modo ricorsivo per ottenere ciascuna proprietà. E ho ricevuto il codice da Recursively Print the properties.Acquisisci in modo ricorsivo proprietà e proprietà figlio di una classe
Il problema con il codice è: scende solo di un livello, mi chiedo come si possono ottenere automaticamente tutte le proprietà utilizzando il riflesso? Ho appena fatto il seguente codice di esempio Contenitore:
public class Container
{
public Bottle MyBottle { get; set; }
public List<Address> Addresses { get; set; }
public Container()
{
Address a = new Address();
a.AddressLine1 = "1 Main St";
a.AddressLine2 = "2 Main St";
Addresses = new List<Address>();
Addresses.Add(a);
MyBottle = new Bottle();
MyBottle.BottleName = "Big bottle";
MyBottle.BottageAge = 2;
}
}
public class Bottle
{
public string BottleName { get; set; }
public int BottageAge { get; set; }
}
public class Address
{
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public List<SpecialFolder> SpecialFolders { get; set; }
public Address()
{
SpecialFolders = new List<SpecialFolder>();
SpecialFolder sf = new SpecialFolder();
sf.TemplateFolder = Environment.SpecialFolder.Templates.ToString();
sf.UserFolder = Environment.SpecialFolder.UserProfile.ToString();
SpecialFolders.Add(sf);
}
}
public class SpecialFolder
{
public string TemplateFolder { get; set; }
public string UserFolder { get; set; }
}
Nel metodo Main:
static void Main(string[] args)
{
Container c = new Container();
PrintProperties(c);
}
public static void PrintProperties(object obj)
{
PrintProperties(obj, 0);
}
public static void PrintProperties(object obj, int indent)
{
if (obj == null) return;
string indentString = new string(' ', indent);
Type objType = obj.GetType();
PropertyInfo[] properties = objType.GetProperties();
foreach (PropertyInfo property in properties)
{
object propValue = property.GetValue(obj, null);
if (property.PropertyType.Assembly == objType.Assembly)
{
Console.WriteLine("{0}{1}:", indentString, property.Name);
PrintProperties(propValue, indent + 2);
}
else
{
Console.WriteLine("{0}{1}: {2}", indentString, property.Name, propValue);
}
}
}
Sto sperando di ottenere:
MyBottle:
BottleName: Big bottle
BottageAge: 2
Addresses:
AddressLine1: 1 Main St
AddressLine2: 2 Main St
SpecialFolders:
TemplateFolder: Templates
UserFolder: UserProfile
Il risultato che ottengo ora:
MyBottle:
BottleName: Big bottle
BottageAge: 2
Addresses: System.Collections.Generic.List`1[TreeViewReflectionExample.Address]
Qualcuno può aiutarmi h il metodo PrintProperties? Grazie mille.
Esattamente quello che stavo cercando, non solo ha funzionato per questo esempio, ma per tutto l'altro caso ho avuto – HoKy22
Questo è stato utile. Ho fatto una piccola aggiunta per assicurarmi che la proprietà possa essere letta prima di chiamare GetValue per prevenire un'eccezione su una proprietà write only - l'ho appena racchiusa con "if (property.CanRead) {...". – thephez
Nice little tidbit of C# 6 sugar sintattico: 'if (propValue is IList elems)' funziona e salva una riga. – CaptainMarvel