Angenommen, ich habe eine dynamische Variable:
dynamic d = *something*
Nun erstellt etwas Eigenschaften zu d
, die ich andererseits aus einem String-Array habe:
string[] strarray = { 'property1','property2',..... }
Ich kenne die Immobiliennamen nicht im Voraus.
Wie im Code kann ich die Werte erhalten, sobald d
erstellt und Strarray aus der DB gezogen wurde?
Ich möchte d.property1 , d.property2
.
Wie ich sehe, hat das Objekt ein _dictionary
-internes Wörterbuch, das die Schlüssel und Werte enthält. Wie kann ich sie abrufen?
Ich weiß nicht, ob es mit dynamisch erstellten Objekten einen eleganteren Weg gibt, aber die Verwendung der einfachen alten Reflexion sollte funktionieren:
var nameOfProperty = "property1";
var propertyInfo = myObject.GetType().GetProperty(nameOfProperty);
var value = propertyInfo.GetValue(myObject, null);
GetProperty
gibt null
zurück, wenn der Typ von myObject
keine öffentliche Eigenschaft mit diesem Namen enthält.
EDIT: Wenn das Objekt kein "reguläres" Objekt ist, sondern etwas, das IDynamicMetaObjectProvider
implementiert, funktioniert dieser Ansatz nicht. Bitte schauen Sie sich stattdessen diese Frage an:
Dadurch erhalten Sie alle in Ihrer dynamischen Variablen definierten Eigenschaftsnamen und -werte.
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);
}
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);
}
}
string json = w.JSON;
var serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new[] { new DynamicJsonConverter() });
DynamicJsonConverter.DynamicJsonObject obj =
(DynamicJsonConverter.DynamicJsonObject)serializer.Deserialize(json, typeof(object));
Nun enthält obj._Dictionary
ein Wörterbuch. Perfekt!
Dieser Code muss in Verbindung mit Deserialize JSON in ein dynamisches C # -Objekt verwendet werden. + macht die _dictionary-Variable im Code dort von "private readonly" öffentlich
Haben Sie die Klasse ExpandoObject gesehen?
Direkt aus MSDN description : "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");
Wenn d von Newtonsoft erstellt wurde, können Sie die Namen und Werte von Eigenschaften lesen:
foreach (JProperty property in d)
{
DoSomething(property.Name, property.Value);
}
Verwenden Sie den folgenden Code, um Name und 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
}
Kannst du versuchen wie:
d?.property1 , d?.property2
Ich habe .netcore 2.1 getestet und arbeite damit
Ich dachte, dies könnte in Zukunft jemandem helfen.
Wenn Sie den Namen der Eigenschaft 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;
}
sie können "dynamicObject.PropertyName.Value
" verwenden, um den Wert der dynamischen Eigenschaft direkt abzurufen.
Beispiel :
d.property11.Value