Как установить словарь ExpandoObject без учета регистра? - PullRequest
6 голосов
/ 14 октября 2011

с учетом кода ниже

dynamic e = new ExpandoObject();
var d = e as IDictionary<string, object>;
for (int i = 0; i < rdr.FieldCount; i++)
   d.Add(rdr.GetName(i), DBNull.Value.Equals(rdr[i]) ? null : rdr[i]);

Есть ли способ сделать его нечувствительным к регистру, так что имя поля employee_name

e.Employee_name работает так же, как e.employee_name

Там, кажется, нет очевидного пути, возможно, взломать?

Ответы [ 5 ]

8 голосов
/ 14 октября 2013

Я использовал этот класс «Flexpando» (для гибкого расширения), который не чувствителен к регистру.

Это похоже на ответ Дэвина MassiveExpando в том, что оно дает вам поддержку словаря, но, выставляя это как поле, избавляет от необходимости реализовывать 15 или около того членов для IDictionary.

public class Flexpando : DynamicObject {
    public Dictionary<string, object> Dictionary
        = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);

    public override bool TrySetMember(SetMemberBinder binder, object value) {
        Dictionary[binder.Name] = value;
        return true;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result) {
        return Dictionary.TryGetValue(binder.Name, out result);
    }
}
5 голосов
/ 14 октября 2011

Вы можете оформить реализацию Massive MassiveExpando, который не учитывает регистр динамического объекта.

1 голос
/ 14 октября 2011

Больше как любопытство, чем как решение:

dynamic e = new ExpandoObject();
var value = 1;
var key = "Key";

var resul1 = RuntimeOps.ExpandoTrySetValue(
    e, 
    null, 
    -1, 
    value, 
    key, 
    true); // The last parameter is ignoreCase

object value2;
var result2 = RuntimeOps.ExpandoTryGetValue(
    e, 
    null, 
    -1, 
    key.ToLowerInvariant(), 
    true, 
    out value2);  // The last parameter is ignoreCase

RuntimeOps.ExpandoTryGetValue/ExpandoTrySetValue использовать внутренние методы ExpandoObject, которые могут контролировать чувствительность к регистру. null, -1, параметры берутся из значений, используемых внутри ExpandoObject (RuntimeOps напрямую вызывает внутренние методы ExpandoObject)

Помните, что эти методы This API supports the .NET Framework infrastructure and is not intended to be used directly from your code.

0 голосов
/ 29 ноября 2012

Другим решением является создание класса, подобного ExpandoObject, производного от System.Dynamic.DynamicObject и переопределения TryGetValue и TrySetValue.

0 голосов
/ 14 октября 2011

открытый статический класс IDictionaryExtensionMethods
{
public static void AddCaseInsensitive (это словарь IDictionary, строковый ключ, значение объекта)
{
dictionary.Add (key.ToUpper (), value);
}

открытый статический объект Get (этот словарь IDictionary, строковый ключ)
{
возвратный словарь [key.ToUpper ()];
}
}

...