web-dev-qa-db-fra.com

Comment obtenez-vous la valeur d'une propriété de PropertyInfo?

J'ai un objet qui a une collection de propriétés. Lorsque j'obtiens l'entité spécifique, je peux voir le champ que je recherche (opportunityid) et que son attribut Value est le Guid pour cette opportunité. C'est la valeur que je veux, mais ce ne sera pas toujours pour une opportunité, et donc je ne peux pas toujours regarder opportunityid, j'ai donc besoin d'obtenir le champ en fonction des entrées fournies par l'utilisateur.

Jusqu'à présent, mon code est:

Guid attrGuid = new Guid();

BusinessEntityCollection members = CrmWebService.RetrieveMultiple(query);

if (members.BusinessEntities.Length > 0)
{
    try
    {
        dynamic attr = members.BusinessEntities[0];
        //Get collection of opportunity properties
        System.Reflection.PropertyInfo[] Props = attr.GetType().GetProperties();
        System.Reflection.PropertyInfo info = Props.FirstOrDefault(x => x.Name == GuidAttributeName);
        attrGuid = info.PropertyType.GUID; //doesn't work.
    }
    catch (Exception ex)
    {
        throw new Exception("An error occurred when retrieving the value for " + attributeName + ". Error: " + ex.Message);
    }
}

La dynamique attr contient le champ que je recherche (dans ce cas opportunityid), qui à son tour contient un champ de valeur, qui est le bon Guid. Cependant, lorsque j'obtiens l'info PropertyInfo (opportunityid), elle n'a plus d'attribut Value. J'ai essayé de regarder le PropertyType.GUID mais cela ne renvoie pas le bon Guid. Comment puis-je obtenir la valeur de cette propriété?

20
sr28

À moins que la propriété ne soit static, il ne suffit pas d'obtenir un objet PropertyInfo pour obtenir la valeur d'une propriété. Lorsque vous écrivez C # "simple" et que vous devez obtenir une valeur d'une propriété, par exemple, MyProperty, vous écrivez ceci:

var val = obj.MyProperty;

Vous fournissez deux choses - le nom de la propriété (c'est-à-dire ce qu'il faut obtenir) et l'objet (c'est-à-dire d'où l'obtenir).

PropertyInfo représente le "quoi". Vous devez spécifier "d'où" séparément. Quand vous appelez

var val = info.GetValue(obj);

vous passez le "d'où" au PropertyInfo, le laissant extraire pour vous la valeur de la propriété de l'objet.

Remarque: avant .NET 4.5, vous devez passer null comme deuxième argument:

var val = info.GetValue(obj, null);
34
dasblinkenlight

Si le nom de la propriété change, vous devez utiliser GetValue :

info.GetValue(attr, null);

Le dernier attribut de cette méthode peut être null, car il s'agit de la valeur d'index, qui n'est nécessaire que lors de l'accès aux tableaux, comme Value[1,2].

Si vous connaissez le nom de l'attribut au préalable, vous pouvez utiliser le comportement dynamic de celui-ci: vous pouvez appeler la propriété sans avoir à faire de réflexion vous-même:

var x = attr.Guid;
4
Patrick Hofman

Utilisez PropertyInfo.GetValue(). En supposant que votre propriété a le type Guid? alors cela devrait fonctionner:

attrGuid = ((System.Guid?)info.GetValue(attr, null)).Value;

Notez qu'une exception sera levée si la valeur de la propriété est nulle.

2
helb

essayez avec:

attrGuid = (Guid)info.GetValue(attr,null)
2
Alberto