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é?
À 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);
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;
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.
essayez avec:
attrGuid = (Guid)info.GetValue(attr,null)