2014-10-15 3 views
5

Ho un oggetto che ha una collezione di proprietà. Quando ottengo l'entità specifica posso vedere il campo che sto cercando (opportunityid) e che è l'attributo Value è l'Guid per questa opportunità. Questo è il valore che voglio, ma non sarà sempre per un'opportunità, e quindi non posso sempre guardare a opportunityid, quindi ho bisogno di ottenere il campo in base all'input fornito dall'utente.Come si ottiene il valore di una proprietà da PropertyInfo?

Il mio codice finora è:

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 dinamica attr contiene il campo che sto cercando (in questo caso opportunityid), che a sua volta contiene un campo valore, che è la corretta Guid. Tuttavia, quando ottengo le informazioni PropertyInfo (opportunityid) non è più presente un attributo Value. Ho provato a guardare il PropertyType.GUID ma questo non restituisce il corretto Guid. Come posso ottenere il valore per questa proprietà?

risposta

7

A meno che la proprietà è static, non è sufficiente ottenere un oggetto PropertyInfo per ottenere un valore di una proprietà. Quando si scrive "plain" C# ed è necessario per ottenere un valore di qualche proprietà, per esempio, MyProperty, si scrive questo:

var val = obj.MyProperty; 

si fornisce due cose - il nome della proprietà (cioè quello che per ottenere) e l'oggetto (cioè da dove trovarlo).

PropertyInfo rappresenta il "cosa". Devi specificare "da dove" separatamente. Quando si chiama

var val = info.GetValue(obj); 

si passa il "da dove" al PropertyInfo, lasciandolo estrarre il valore della proprietà dall'oggetto per voi.

Nota: prima di .NET 4.5 è necessario passare null come secondo argomento:

var val = info.GetValue(obj, null); 
+0

Bella spiegazione! GetValue() ha un secondo parametro che deve essere nullo. – helb

+0

Sembra proprio quello di cui ho bisogno. Sto solo andando a testarlo per essere sicuro di aver capito. – sr28

+0

Hmmm, sono sicuro che questo metodo funzionerebbe se l'avessi capito. Tuttavia, sto ricevendo un'eccezione dicendo che non è possibile convertire CRMWebService.Key in System.Guid. Ho praticamente fatto attrGuid = (Guid) info.GetValue (attr, null); – sr28

2

Utilizzare PropertyInfo.GetValue(). Supponendo che la vostra proprietà è il tipo Guid? allora questo dovrebbe funzionare:

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

noti che un'eccezione verrà generata se il valore della proprietà è null.

2

provare con:

attrGuid = (Guid)info.GetValue(attr,null) 
3

Se il nome della proprietà sta cambiando, è necessario utilizzare GetValue:

info.GetValue(attr, null); 

L'ultimo attributo di tale metodo può essere null, dal momento che è l'indice valore, e ciò è necessario solo quando si accede ad array, come Value[1,2].

Se si conosce il nome dell'attributo in anticipo, è possibile utilizzare il dynamic comportamento di esso: è possibile chiamare la proprietà, senza la necessità di fare riflessione te stesso:

var x = attr.Guid; 
+0

Sarebbe questo non mi danno il GUID attr?Nel mio esempio attr rappresenta un'entità, che a sua volta ha la proprietà opportunityid, che a sua volta ha un valore (guid), quindi non ho bisogno di ottenere prima la proprietà chiamata opportunityid? – sr28

+0

Puoi digitare dietro di esso quello che vuoi, purché sia ​​una proprietà esistente, poiché è comunque JIT. –

+0

Spiega perché questo dovrebbe funzionare – helb