Stellen Sie sich vor, ich habe eine dynamische Variable:
dynamic d = *something*
Jetzt erstelle ich Eigenschaften, für d
die ich andererseits habe, aus einem String-Array:
string[] strarray = { 'property1','property2',..... }
Ich kenne die Eigenschaftsnamen nicht im Voraus.
Wie d
kann ich im Code die Werte abrufen , sobald er erstellt und strarray aus der Datenbank abgerufen wurde?
Ich will bekommen d.property1 , d.property2
.
Ich sehe, dass das Objekt ein _dictionary
internes Wörterbuch hat, das die Schlüssel und die Werte enthält. Wie kann ich sie abrufen?
c#
reflection
.net-4.0
sergata.NET LTD
quelle
quelle
something
einIDynamicMetaObjectProvider
?something
im Debugger und sehen Sie sich seine öffentlichen Mitglieder an.d.GetType()
Sie zur Laufzeit erhalten?Antworten:
Ich weiß nicht, ob es einen dynamischeren Weg mit dynamisch erstellten Objekten gibt, aber die Verwendung einer einfachen alten Reflexion sollte funktionieren:
var nameOfProperty = "property1"; var propertyInfo = myObject.GetType().GetProperty(nameOfProperty); var value = propertyInfo.GetValue(myObject, null);
GetProperty
wird zurückgegeben,null
wenn der Typ vonmyObject
keine öffentliche Eigenschaft mit diesem Namen enthält.BEARBEITEN : Wenn das Objekt kein "normales" Objekt ist, sondern etwas Implementiertes
IDynamicMetaObjectProvider
, funktioniert dieser Ansatz nicht. Bitte schauen Sie sich stattdessen diese Frage an:quelle
Dadurch erhalten Sie alle Eigenschaftsnamen und Werte, die in Ihrer dynamischen Variablen definiert sind.
dynamic d = { // your code }; object o = d; string[] propertyNames = o.GetType().GetProperties().Select(p => p.Name).ToArray(); foreach (var prop in propertyNames) { object propValue = o.GetType().GetProperty(prop).GetValue(o, null); }
quelle
Hoffe das würde dir helfen:
public static object GetProperty(object o, string member) { if(o == null) throw new ArgumentNullException("o"); if(member == null) throw new ArgumentNullException("member"); Type scope = o.GetType(); IDynamicMetaObjectProvider provider = o as IDynamicMetaObjectProvider; if(provider != null) { ParameterExpression param = Expression.Parameter(typeof(object)); DynamicMetaObject mobj = provider.GetMetaObject(param); GetMemberBinder binder = (GetMemberBinder)Microsoft.CSharp.RuntimeBinder.Binder.GetMember(0, member, scope, new CSharpArgumentInfo[]{CSharpArgumentInfo.Create(0, null)}); DynamicMetaObject ret = mobj.BindGetMember(binder); BlockExpression final = Expression.Block( Expression.Label(CallSiteBinder.UpdateLabel), ret.Expression ); LambdaExpression lambda = Expression.Lambda(final, param); Delegate del = lambda.Compile(); return del.DynamicInvoke(o); }else{ return o.GetType().GetProperty(member, BindingFlags.Public | BindingFlags.Instance).GetValue(o, null); } }
quelle
Verwenden Sie den folgenden Code, um den Namen und den Wert der Eigenschaft eines dynamischen Objekts abzurufen.
dynamic d = new { Property1= "Value1", Property2= "Value2"}; var properties = d.GetType().GetProperties(); foreach (var property in properties) { var PropertyName=property.Name; //You get "Property1" as a result var PropetyValue=d.GetType().GetProperty(property.Name).GetValue(d, null); //You get "Value1" as a result // you can use the PropertyName and Value here }
quelle
PSObject
string json = w.JSON; var serializer = new JavaScriptSerializer(); serializer.RegisterConverters(new[] { new DynamicJsonConverter() }); DynamicJsonConverter.DynamicJsonObject obj = (DynamicJsonConverter.DynamicJsonObject)serializer.Deserialize(json, typeof(object));
obj._Dictionary
Enthält jetzt ein Wörterbuch. Perfekt!Dieser Code muss in Verbindung mit JSON in dynamisches C # -Objekt deserialisieren verwendet werden. + Machen Sie die Variable _dictionary im Code dort von "privat schreibgeschützt" zu öffentlich
quelle
Haben Sie die ExpandoObject- Klasse gesehen?
Direkt aus der MSDN-Beschreibung : "Stellt ein Objekt dar, dessen Mitglieder zur Laufzeit dynamisch hinzugefügt und entfernt werden können."
Damit können Sie Code wie folgt schreiben:
dynamic employee = new ExpandoObject(); employee.Name = "John Smith"; ((IDictionary<String, Object>)employee).Remove("Name");
quelle
ExpandoObject
, wiePSObject
.Wenn d von Newtonsoft erstellt wurde, können Sie damit Eigenschaftsnamen und -werte lesen:
foreach (JProperty property in d) { DoSomething(property.Name, property.Value); }
quelle
Dachte, dies könnte jemandem in der Zukunft helfen.
Wenn Sie den Eigenschaftsnamen bereits kennen, können Sie Folgendes tun:
[HttpPost] [Route("myRoute")] public object SomeApiControllerMethod([FromBody] dynamic args){ var stringValue = args.MyPropertyName.ToString(); //do something with the string value. If this is an int, we can int.Parse it, or if it's a string, we can just use it directly. //some more code here.... return stringValue; }
quelle
Sie können "
dynamicObject.PropertyName.Value
" verwenden, um den Wert der dynamischen Eigenschaft direkt abzurufen.Beispiel :
quelle
Sie können so versuchen:
Ich habe es getestet und arbeite mit .netcore 2.1
quelle