Я использую динамический словарь в C #. Проблема, с которой я сталкиваюсь, заключается в поведении TryGetMember, которое я переопределяю в классе динамического словаря.
Вот код динамического словаря.
class DynamicDictionary<TValue> : DynamicObject
{
private IDictionary<string, TValue> m_dictionary;
public DynamicDictionary(IDictionary<string, TValue> a_dictionary)
{
m_dictionary = a_dictionary;
}
public override bool TryGetMember(GetMemberBinder a_binder, out object a_result)
{
bool returnValue = false;
var key = a_binder.Name;
if (m_dictionary.ContainsKey(key))
{
a_result = m_dictionary[key];
returnValue = true;
}
else
a_result = null;
return returnValue;
}
}
Здесь TryGetMember будет вызываться во время выполнения всякий раз, когда мы ссылаемся на какой-либо ключ извне, но странно, что член Name связывателя, который всегда дает ключ, на который мы ссылаемся извне, всегда разрешает имя ключа, записанное в виде букв алфавита.
например. если объект DynamicDictionary выполнен как:
Dictionary<string,List<String>> dictionaryOfStringVsListOfStrings;
//here listOfStrings some strings list already populated with strings
dictionaryOfStringVsListOfStrings.Add("Test", listOfStrings);
dynamic dynamicDictionary_01 = new
DynamicDictionary<List<String>(dictionaryOfStringVsListOfStrings);
string somekey = "Test";
//will be resolve at runtime
List<String> listOfStringsAsValue = dynamicDictionary_01.somekey
Теперь, что здесь происходит, «somekey» станет значением a_binder (т.е. a_binder.Name = «somekey»). Он должен быть разрешен как a_binder.Name = "Test", а затем из динамического словаря он найдет listOfStrings для этого ключа (то есть фактически "Test", но он разрешает не значение, а фактическое имя переменной как ключ).
Есть ли способ обойти это?