J'ai une classe: Transaction.cs
public class Transaction
{
public int Transaction_id { get; set; }
public string Description { get; set; }
public string Item { get; set; }
}
Je veux aussi utiliser la réflexion pour obtenir les valeurs qui sont dans la collection de transactions, c'est-à-dire:
var db = new List<Transaction>();
var temp = new Transaction { Transaction_id = 123, Item = "AKP", Description = "Startup" };
var info = temp.GetType().GetProperties();
db.Add(new Transaction { Transaction_id = 45, Item = "RW", Description = "Starting" });
var type = typeof(Transaction);
var prop = type.GetProperty("Item");
var value = prop.GetValue(temp);
A ajouté ce code pour la boucle sur les propriétés:
foreach (var testing in db.GetType().GetProperties())
{
var sample = testing.GetValue(db);
Console.WriteLine(sample);
}
J'obtiens une valeur de 4 affichée en ligne de commande.
Ce qui me donnerait la valeur d'AKP à l'écran. Maintenant, comment ça marche quand j'ai une liste de transactions?
Merci
3 réponses
Les listes génériques sont de type sécurisé, vous n'avez donc pas besoin d'utiliser la réflexion.
Pour parcourir la liste, utilisez foreach
.
var db = new List<Transaction>
{
new Transaction { Transaction_id = 123, Item = "AKP", Description = "Startup" },
new Transaction { Transaction_id = 45, Item = "RW", Description = "Starting" }
}
foreach (var transaction in db)
{
Console.WriteLine(transaction.Item);
}
Production:
AKP
RW
Si vous avez vraiment besoin d'utiliser Reflection, et que ce genre de chose est courant dans votre base de code, je prendrais le temps d'écrire une méthode d'extension comme celle-ci:
static T GetPropertyByName<T>(this object input, string name)
{
return (T)input
.GetType()
.GetProperty(name, BindingFlags.Instance)
.GetValue(input);
}
Et utilisez-le comme ceci:
foreach (var transaction in db)
{
Console.WriteLine(transaction.GetPropertyByName<string>("Item"));
}
Ou si vous ne connaissez pas les noms des propriétés à l'avance:
foreach (var row in db)
{
foreach (var p in row.GetType().GetProperties(BindingFlags.Instance))
{
Console.WriteLine(p.GetValue(row));
}
}
Considérant que vous avez cette liste:
var transactionList = new List<Transaction>
{
new Transaction { Transaction_id = 123, Item = "AKP", Description = "Startup" },
new Transaction { Transaction_id = 45, Item = "RW", Description = "Starting" }
};
Vous pouvez parcourir les noms de propriété de chaque élément de la collection en lisant les propriétés d'un élément unique tout en itérant la liste:
foreach (var item in transactionList)
{
foreach (var property in item.GetType().GetProperties())
{
Console.WriteLine("{0}={1}", property.Name, property.GetValue(item, null));
}
}
Console.ReadLine();
Par exemple, si je veux définir toutes les propriétés sur string.Empty dans ma classe, je ferais quelque chose comme ça, vous pourriez appliquer la même logique dans la boucle foreach pour obtenir vos types de propriétés, etc.
public static void ConvertNullToStringEmpty<T>(this T clsObject) where T : class
{
PropertyInfo[] properties = clsObject.GetType().GetProperties();//typeof(T).GetProperties();
foreach (var info in properties)
{
// if a string and null, set to String.Empty
if (info.PropertyType == typeof(string) && info.GetValue(clsObject, null) == null)
{
info.SetValue(clsObject, String.Empty, null);
}
}
}
De nouvelles questions
c#
C # (prononcé "see sharp") est un langage de programmation multi-paradigme de haut niveau, typé statiquement développé par Microsoft. Le code C # cible généralement la famille d'outils et d'exécutions Microsoft .NET, notamment le .NET Framework, .NET Core et Xamarin. Utilisez cette balise pour les questions sur le code écrit en C # ou en spécification formelle de C #.