2016-05-11 6 views
0

Gibt es eine Möglichkeit, dynamisch auf das Wörterbuchelement zuzugreifen, wenn der Elementname als Zeichenfolge in einer Variablen gespeichert wird?Dynamisches Zugreifen auf als Zeichenfolge in einer Variablen gespeichertes Wörterbuchelement

string field2 = "Entity[\"EmpId\"]"; 

Ich habe versucht, den String-Typen Zugriff auf und es funktioniert wie erwartet, aber nicht in der Lage zu verstehen, wie das Wörterbuch Elementwert dynamisch zu bekommen. Hier ist, was ich bisher versucht habe. Demo here

using System; 
using System.Collections.Generic; 

public class Program 
{ 
    public static void Main() 
    { 
     Message message = new Message(); 
     message.EntityId = "123456"; 

     message.Entity = new Dictionary<string, string>() 
     { 
      { "EmpId", "987654"}, 
      { "DeptId", "10"} 
     }; 

     // Dynamically accessing the field WORKS 
     string field1 = "EntityId"; 
     var v1 = message.GetType().GetProperty(field1).GetValue(message, null); // <-- Works as expected 
     Console.WriteLine("EntityId: " + v1.ToString()); // <-- Output: 123456 

     // Dynamically accessing a Dictionary element DOESN'T WORK 
     string field2 = "Entity[\"EmpId\"]"; 
     var v2 = message.GetType().GetProperty(field2).GetValue(message, null); // <-- Throws an exception 
     //Console.WriteLine("Name: " + v2.ToString()); // <-- Expected Outut: 987654 

     Console.WriteLine(); 
    } 

    class Message 
    { 
     public string EntityId { get; set; } 

     // Replacing EntityId with a Dictionary as we have more than one Entities 
     public Dictionary<string, string> Entity { get; set; } 
    } 
} 

Antwort

0

Sie haben falsch geantwortet. Gehen Sie wie folgt

string field2 = "Entity"; 
var v2 = message.GetType().GetProperty(field2).GetValue(message, null) as Dictionary<string, string>; 

Console.WriteLine("Name: " + v2["EmpId"]); // Outut: 987654 
+0

OP bat um ** dynamisch Zugriff ** ein Wörterbuch Element. Du hast es direkt gemacht. – Xiaoy312

+0

Nicht sicher, ob die Besetzung nicht gewünscht ist, da es bereits sagt, dass es ein Wörterbuch sein wird. – SirH

+0

Es scheint fast so, als wollte OP auf das Objekt über den XML-Selektor zugreifen, was ohne einen Zaubertrick nicht funktionieren wird. – Xiaoy312

0

Reflexion nicht XML ist, haben Sie durch sie Schicht für Schicht arbeiten:

// First, get the Entity property, and invoke the getter 
var entity = message.GetType().GetProperty("Entity").GetValue(message); 
// Second, get the indexer property on it, and invoke the getter with an index(key) 
var empId = entity.GetType().GetProperty("Item").GetValue(entity, new[] { "EmpId" }); 

Console.WriteLine("Name: " + empId); 
0

Es kann wie folgt erfolgen:

//string field2 = "Entity[\"EmpId\"]"; 
string f2="Entity";string key="EmpId"; 
var v2 =((Dictionary<string,string>)message.GetType().GetProperty(f2).GetValue(message, null))[key]; 

Sie können es sehen Arbeiten bei hier https://dotnetfiddle.net/Mobile?id=fc89qQ#code-editor

Verwandte Themen