2013-05-22 2 views
2

HI ребята говорят, у меня есть объект с типом словаряC# словарь/список с отражением

Я уже сделал функцию, которая будет добавлять данные в словарь и получить данные из словаря с помощью отражения.

Моя проблема в том, как изменить элемент в словаре, используя отражение?

Пример в коде (не используя отражения):

dictionary<string, string> dict = new dictionary<string, string>(); 
dict.add("key1", "data1"); 
dict.add("key2", "data2"); 
console.writeline(dict["key2"]) // <- made using dynamic since it wont store to the objact data (made from relfection) 

// code above already accomplished using reflection way 
// code below, don't know how to accomplish using reflection way 

dict["key2"] = "newdata" // <- how to modify the value of the selected item in object data (made from using reflection) 
+0

У вас есть [IDE] (http://en.wikipedia.org/wiki/Integrated_development_environment), которая поддерживает подсветку синтаксиса при ошибках компиляции? Пожалуйста, приложите усилия и покажите код, который, по крайней мере, компилируется. –

+0

Почему вы должны использовать отражение? –

+0

Мне нужно использовать отражение, потому что я перечислял методы и переменные в XML-файле и знаю, что хочу выполнить каждое действие в XML-файле – user2381378

ответ

1

Вы должны найти свойство индексатор вам нужно, и установить значение через что:

object key = // 
object newValue = // 
PropertyInfo indexProp = dict.GetType() 
    .GetProperties() 
    .First(p => p.GetIndexParameters().Length > 0 && p.GetIndexParameters()[0].ParameterType == key.GetType()); 

indexProp.SetValue(dict, newValue, new object[] { key }); 

Если вы знаете, что вы имеете дело с помощью общего словаря, вы можете получить это свойство напрямую, т.е.

PropertyInfo indexProp = dict.GetType().GetProperty("Item"); 
0
 var dictionary = new Dictionary<string, string> 
     { 
      { "1", "Jonh" }, 
      { "2", "Mary" }, 
      { "3", "Peter" }, 
     }; 

     Console.WriteLine(dictionary["1"]); // outputs "John" 

     // this is the indexer metadata; 
     // indexer properties are named with the "Item" 
     var prop = dictionary.GetType().GetProperty("Item"); 

     // the 1st argument - dictionary instance, 
     // the second - new value 
     // the third - array of indexers with single item, 
     // because Dictionary<TKey, TValue>.Item[TKey] accepts only one parameter 
     prop.SetValue(dictionary, "James", new[] { "1" }); 

     Console.WriteLine(dictionary["1"]); // outputs "James"