2011-10-13 74 views
5

下面给出如何将ExpandoObject的字典设置为不区分大小写?

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

您可以结算Massive's实施MassiveExpando这是不区分大小写的动态对象。

+0

有趣的是,没有意识到这个大规模的叉子,这个自从feb以来没有更新过,因此将研究差异,谢谢! – Kumar

1

更多作为好奇心不是作为一个解决方案:的ExpandoObject可控制的情况下的灵敏度

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使用内部的方法。的null, -1,参数是从由ExpandoObject内部使用的值取(RuntimeOps直接调用的ExpandoObject内部方法)

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

+0

过时不能在.net 4中编译http://msdn.microsoft.com/zh-cn/library/dd782193。aspx – Kumar

+0

@Kumar我必须说实话...是的,我已经测试了Visual Studio 2010上的代码,它工作正常。只是为了确定今天早上我再次测试它,它的工作原理:-)有趣的是'ExpandoTryGetValue'和'ExpandoTrySetValue'在我的计算机上没有被标记为过时,所以我没有收到任何警告。 – xanatos

+0

嗯,有趣的,不知道这里可能会有什么不同!我无法编译,所以找到答案并找到了msdn页面!我在xp sp3上有vs2010最终sp1!有没有测试版或任何东西在这台电脑上,不熟悉.NET 4 SP1或预览,任何想法? – Kumar

0

公共静态类IDictionaryExtensionMethods
{
   公共静态无效AddCaseInsensitive(此IDictionary字典,字符串键,对象值)
    {
        dictionary.Add(key.ToUpper(),value);
   }

   公共静态对象获取(此IDictionary的字典,串键)
    {
         返回字典[key.ToUpper()];
   }
}

0

另一种解决方案是通过从System.Dynamic.DynamicObject和压倒一切TryGetValueTrySetValue导出创建ExpandoObject样类。

+1

请参阅[我的答案](http://stackoverflow.com/a/19354229/87453) –

7

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

它与Darin's 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); 
    } 
} 
+2

我喜欢简单但觉得应该对内部有更多的控制权。也许有两个构造函数,一个是空的,默认是你在这里得到的,另一个是需要一个IDictionary ,或者构造函数设置Dictionary字段,我将把它变成一个带有私有setter的公共属性。 –

相关问题