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

0
tecman134 29 nov. 2017 à 23:58

3 réponses

Meilleure réponse

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));
    }
}
0
John Wu 29 nov. 2017 à 21:50

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();
0
Mithgroth 29 nov. 2017 à 21:10

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);
        }
    }
}
0
MethodMan 29 nov. 2017 à 21:09
47561687