it-swarm.com.de

Eigenschaftswert von dynamischem C # -Objekt durch Zeichenfolge abrufen (Reflektion?)

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?

63
sergata.NET LTD

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:

88
Heinzi

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

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

5
sergata.NET LTD

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");
4
ADIMO

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

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
 }
1
Ghebrehiywet

Kannst du versuchen wie:

d?.property1 , d?.property2

Ich habe .netcore 2.1 getestet und arbeite damit

0
Deepak Shaw

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;
}
0
cloudstrifebro

sie können "dynamicObject.PropertyName.Value" verwenden, um den Wert der dynamischen Eigenschaft direkt abzurufen.

Beispiel :

d.property11.Value
0
abhishek shetye