199 votes

Obtenir les propriétés et les valeurs d'objet inconnu

Du monde de PHP, j'ai décidé de donner à C#. J'ai eu une recherche mais n'arrive pas à trouver la réponse sur la façon de faire l'équivalent de ce.

$object = new Object();

$vars = get_class_vars(get_class($object));

foreach($vars as $var)
{
    doSomething($object->$var);
}

En fait j'ai une Liste d'un objet. L'objet pourrait être de trois types différents et ont un ensemble de propriétés publiques. Je veux être en mesure d'obtenir une liste des propriétés de l'objet, de la boucle au-dessus d'eux et puis les écrire dans un fichier. Je pense que cela a quelque chose à voir avec c# réflexion, mais c'est tout nouveau pour moi.

Toute aide serait grandement appréciée.

343voto

Cocowalla Points 4798

Cela devrait le faire:

Type myType = myObject.GetType();
IList<PropertyInfo> props = new List<PropertyInfo>(myType.GetProperties());

foreach (PropertyInfo prop in props)
{
    object propValue = prop.GetValue(myObject, null);

    // Do something with propValue
}

21voto

casperOne Points 49736

Oui, la Réflexion serait la voie à suivre. Tout d'abord, vous obtiendrez l' Type qui représente le type (à l'exécution) de l'instance dans la liste. Vous pouvez le faire en appelant l' GetType méthode Object. Parce que c'est sur l' Object classe, c'est appelable par chaque objet .NET, tous les types de dériver à partir de Object (eh bien, techniquement, pas tout, mais ce n'est pas important ici).

Une fois que vous avez l' Type exemple, vous pouvez appeler l' GetProperties méthode pour obtenir l' PropertyInfo des instances qui représentent le moment de l'exécution informationa sur les propriétés de l' Type.

Remarque, vous pouvez utiliser les surcharges de GetProperties pour permettre de classer les dont les propriétés vous récupérer.

À partir de là, vous serait tout simplement écrire les informations dans un fichier.

Votre code ci-dessus, traduit, serait:

// The instance, it can be of any type.
object o = <some object>;

// Get the type.
Type type = o.GetType();

// Get all public instance properties.
// Use the override if you want to classify
// which properties to return.
foreach (PropertyInfo info in type.GetProperties())
{
    // Do something with the property info.
    DoSomething(info);
}

Notez que si vous voulez des renseignements sur la méthode ou le champ de l'information, vous devez appeler l'une des surcharges de la GetMethods ou GetFields méthodes respectivement.

À noter également, c'est une chose de lister les membres d'un fichier, mais vous ne devriez pas utiliser cette information pour favoriser la logique basée sur les jeux de propriétés.

En supposant que vous avez le contrôle sur la mise en œuvre des types, vous devez dériver d'une classe de base commune ou de mettre en œuvre une interface commune et de faire des appels sur ceux (vous pouvez utiliser l' as ou is de l'opérateur pour déterminer la classe de base/l'interface vous travaillez à l'exécution).

Toutefois, si vous n'avez pas le contrôle de ces définitions de type et de conduire la logique basée sur le filtrage, alors que c'est bien.

18voto

AlexanderMP Points 6147

eh bien, en C# c'est similaire. Voici l'un des exemples les plus simples (uniquement pour les propriétés publiques):

var SomeObject = new { .../*properties*/... };
var PropertyInfos = SomeObject.GetType().GetProperties();
foreach(PropertyInfo pInfo in PropertyInfos)
{
    string propertyName = pInfo.Name; //gets the name of the property
    doSomething(pInfo.GetValue(SomeObject,null));
}

11voto

RAJ Points 261

Pour obtenir spécifique de la valeur de la propriété nom de la propriété

public class Bike{
public string Name {get;set;}
}

Bike b = new Bike {Name = "MyBike"};

pour accéder à la valeur de la propriété Nom de la chaîne de nom de propriété

public object GetPropertyValue(string propertyName)
{
//returns value of property Name
return this.GetType().GetProperty(propertyName).GetValue(this, null);
} 

2voto

Rob Points 24505

Voici quelque chose que j'utilise pour transformer un IEnumerable<T> en DataTable qui contient des colonnes représentant T's propriétés, avec une ligne pour chaque élément dans l' IEnumerable:

public static DataTable ToDataTable<T>(IEnumerable<T> items)
{
    var table = CreateDataTableForPropertiesOfType<T>();
    PropertyInfo[] piT = typeof(T).GetProperties();
    foreach (var item in items)
    {
        var dr = table.NewRow();
        for (int property = 0; property < table.Columns.Count; property++)
        {
            if (piT[property].CanRead)
            {
                var value = piT[property].GetValue(item, null);
                if (piT[property].PropertyType.IsGenericType)
                {
                    if (value == null)
                    {
                        dr[property] = DBNull.Value;
                    }
                    else
                    {
                        dr[property] = piT[property].GetValue(item, null);
                    }
                }
                else
                {
                    dr[property] = piT[property].GetValue(item, null);
                }
            }
        }
        table.Rows.Add(dr);
    }
    return table;
}

public static DataTable CreateDataTableForPropertiesOfType<T>()
{
    DataTable dt = new DataTable();
    PropertyInfo[] piT = typeof(T).GetProperties();
    foreach (PropertyInfo pi in piT)
    {
        Type propertyType = null;
        if (pi.PropertyType.IsGenericType)
        {
            propertyType = pi.PropertyType.GetGenericArguments()[0];
        }
        else
        {
            propertyType = pi.PropertyType;
        }
        DataColumn dc = new DataColumn(pi.Name, propertyType);

        if (pi.CanRead)
        {
            dt.Columns.Add(dc);
        }
    }
    return dt;
}

C'est "un peu" trop compliqué, mais c'est vraiment très bon pour voir ce que le résultat est, comme vous pouvez lui donner un List<T> de, par exemple:

public class Car
{
    string Make { get; set; }
    int YearOfManufacture {get; set; }
}

Et vous serez renvoyé un DataTable avec la structure:

Faire (string)
YearOfManufacture (int)

Avec une ligne par élément dans votre List<Car>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X