2011-10-13 12 views
5

が大文字小文字を区別しないので、与えられたフィールド名EMPLOYEE_NAMEにする方法はあり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]); 

以下のコードを与え

e.Employee_nameは「はdoesnのe.employee_name

と同じようにうまく動作します明らかな方法、おそらくハックのように思われる?

答えて

4

チェックアウト可能性がありますMassiveExpandoの実装は、大文字と小文字を区別しない動的オブジェクトです。溶液としてより好奇心として

+0

興味深いことに、興味深いことに、この大規模なフォークを認識していない、これはfebので更新されていないので、違いを見て、ありがとう! – Kumar

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,パラメータは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/en-us/library/dd782193aspx – Kumar

+0

@Kumar真実を伝えなければならない...はい、私はVisual Studio 2010でコードをテストしていました。今朝私はもう一度それをテストしました。それはうまくいきました:-)興味深いことに、 'ExpandoTryGetValue'と' ExpandoTrySetValue'は私のコンピュータ上では時代遅れとマークされていないので、警告は表示されませんでした。 – xanatos

+0

こんにちは、興味深い、ここで何が違うかわからない!私はコンパイルできなかったので、答えを探しに行き、msdnページを見つけました!私はxp sp3でvs2010の究極のsp1を持っています!このPCにはベータ版や何かがありません.net 4 sp1やプレビューのいずれかに精通していない方もいらっしゃると思いますか? – Kumar

0

パブリック静的クラスIDictionaryExtensionMethodsであることに注意してくださいAddCaseInsensitive(このID辞書辞書、文字列キー、オブジェクト値)
    {
        dictionary.Add(key.ToUpper()、value);
   }

   パブリック静的オブジェクト取得(本IDictionaryを辞書、文字列キー)
    {
         戻り辞書[key.ToUpper()]。
   }
}

0

別の解決策は、System.Dynamic.DynamicObject由来するとTryGetValueTrySetValueをオーバーライドしExpandoObject様クラスを作成することです。

+1

例については[私の答え](http://stackoverflow.com/a/19354229/87453)を参照してください –

7

私は大文字と小文字を区別しないでこのフレックスパンド”クラス(フレキシブルエクスパンダ用)を使用しています。

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

私はシンプルさが好きですが、 。おそらく2つのコンストラクター、空の空の1つはここにあるもの、IDictionary を取る1つのコンストラクターは辞書フィールドを設定します。これはプライベートセッターでパブリックプロパティに変更します。 –

関連する問題