2014-10-15 9 views
5

Ich habe ein Objekt mit einer Sammlung von Eigenschaften. Wenn ich die spezifische Entität erhalte, kann ich das Feld sehen, nach dem ich suche (opportunityid), und das ist Value Attribut ist die Guid für diese Gelegenheit. Dies ist der Wert, den ich will, aber es wird nicht immer für eine Gelegenheit sein, und deshalb kann ich nicht immer auf opportunityid schauen, also muss ich das Feld basierend auf der vom Benutzer gelieferten Eingabe erhalten.Wie erhalten Sie den Wert einer Eigenschaft von PropertyInfo?

Mein Code so weit ist:

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); 
    } 
} 

Die dynamische attr enthält das Feld ich suche (in diesem Fall opportunityid), die wiederum ein Wertfeld enthält, das die korrekte Guid ist. Jedoch, wenn ich die PropertyInfo Info (opportunityid) bekomme, hat es kein Value Attribut mehr. Ich habe versucht, die PropertyType.GUID zu betrachten, aber dies gibt nicht die richtige Guid zurück. Wie kann ich den Wert für diese Eigenschaft erhalten?

Antwort

7

Es sei denn, das Eigentum ist static, Es reicht nicht, ein Objekt PropertyInfo zu erhalten, um einen Wert einer Eigenschaft zu erhalten. Wenn Sie „plain“ C# schreiben, und Sie müssen einen Wert von einer Eigenschaft erhalten, sagen wir, MyProperty, schreiben Sie diese:

var val = obj.MyProperty; 

Sie liefern zwei Dinge - den Namen der Eigenschaft (dh, was zu bekommen) und das Objekt (zB von wo man es bekommt).

PropertyInfo stellt das "was" dar. Sie müssen "von wo" getrennt angeben. Wenn Sie

var val = info.GetValue(obj); 

nennen passieren Sie das „von wo“ der PropertyInfo, lassen es für Sie den Wert der Eigenschaft aus dem Objekt extrahieren.

Hinweis: vor dem .NET 4.5 Sie als zweites Argument null übergeben müssen:

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

Schöne Erklärung! GetValue() hat einen zweiten Parameter, der jedoch null sein muss. – helb

+0

Klingt wie, was ich brauche. Ich werde es einfach testen, um sicherzugehen, dass ich es verstehe. – sr28

+0

Hmmm, ich bin mir sicher, dass diese Methode funktionieren würde, wenn ich sie verstehen würde. Ich bekomme jedoch eine Ausnahme, die besagt, dass CRMWebService.Key nicht in System.Guid konvertiert werden kann. Ich habe im Wesentlichen getan, attrGuid = (Guid) info.GetValue (attr, null); – sr28

2

Verwenden Sie PropertyInfo.GetValue(). Unter der Annahme, Ihre Immobilie Guid? der Typ dann sollte diese Arbeit:

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

Beachten Sie, dass eine Ausnahme ausgelöst wird, wenn der Wert der Eigenschaft null ist.

2

versuchen mit:

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

Wenn der Name der Eigenschaft ändert, sollten Sie GetValue:

info.GetValue(attr, null); 

Das letzte Attribut dieser Methode null sein kann, da es der Index Wert, und das ist nur beim Zugriff auf Arrays wie Value[1,2] erforderlich.

Wenn Sie den Namen des Attributs wissen auf vorher, können Sie das dynamic Verhalten könnte es benutzen: Sie haben die Eigenschaft, ohne die Notwendigkeit zu tun, Reflexion selbst anrufen:

var x = attr.Guid; 
+0

Wäre das mir nicht die Guid von attr?In meinem Beispiel stellt attr eine Entität dar, die wiederum die Eigenschaft "chancelid" hat, die wiederum einen Wert (guid) hat. Muss ich also nicht zuerst die Eigenschaft "opportunityid" aufrufen? – sr28

+0

Sie können hinter es schreiben, was auch immer Sie wollen, solange es eine vorhandene Eigenschaft ist, da es sowieso JIT'ed ist. –

+0

Bitte erläutern Sie, warum dies funktioniert – helb