8

给出下面的代码

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 一样有效

似乎没有明显的方法,也许是黑客?

4

5 回答 5

8

我一直在使用这个不区分大小写的“Flexpando”类(用于灵活扩展)。

它类似于Darin 的 MassiveExpando答案,因为它为您提供字典支持,但通过将其公开为一个字段,它不必为 IDictionary 实现 15 个左右的成员。

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);
    }
}
于 2013-10-14T05:55:46.400 回答
5

您可以查看Massive 的MassiveExpando不区分大小写的动态对象的实现。

于 2011-10-13T20:33:55.697 回答
1

与其说是解决方案,不如说是一种好奇心:

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,参数取自ExpandoObjectRuntimeOps直接调用内部方法ExpandoObject)内部使用的值

请记住,这些方法是This API supports the .NET Framework infrastructure and is not intended to be used directly from your code.

于 2011-10-13T20:42:03.883 回答
0

ExpandoObject另一种解决方案是通过派生System.Dynamic.DynamicObject和覆盖TryGetValueand来创建一个类似的类TrySetValue

于 2012-11-29T15:03:16.767 回答
0
public static class IDictionaryExtensionMethods
{
  public static void AddCaseInsensitive(this IDictionary dictionary, string key, object value)
  {
    dictionary.Add(key.ToUpper(), value);
  }

  public static object Get(this IDictionary dictionary, string key)
  {
    return dictionary[key.ToUpper()];
  }
}
于 2011-10-13T21:23:45.213 回答