2017-06-28 13 views
0

タイトルの状態は次のとおりです。私は構造型の配列を持っています(下記参照)。 しかし、データを抽出しようとしているのは、Object型として評価されているためです。 これが不可能な場合は、可能であれば、私は本当にこれの変形を愛しています。KeyValuePair <>をC#でのパラメータの型として追加することは可能ですか?

private Entity makeEntity(params KeyValuePair<String, object>[] fields) 
    { 
     Entity entity = new Entity(); 

     IEnumerator cons = fields.GetEnumerator(); 
     Field field; 
     Value value; 
     while (cons.MoveNext()){ 
      value = new Value(); 
       value.value = cons.Current.Value; 
      field = new Field(); 
       field.name = cons.Current.Key; 
       field.values.Add(value); 
       entity.fields.Add(field); 
     } 

     return entity; 
    } 
+0

問題がある場合は、.NET(「オブジェクト」タイプ)と関係があります。 – Olivier10178

+0

'cons.Current.Value'を' value.value'に代入する前に必要な型にキャストしようとしましたか?それ以外の場合は、私があなたが求めているものをundestroodを確信していません:) –

+0

あなたが何をしたいか説明してください。タイトル*はまったく役に立たない。 'params'はここでは使われていない特定の構文を持っています。あなたは明示的にあなたが 'object'値を受け取りたいと言っています。最初に何をしようとしていますか? 'dynamic'を使わずに' dynamic'型を渡そうとしていますか? –

答えて

-2

私は

What is the best way to convert an IEnumerator to a generic IEnumerator?

で提案されているキャスト関数は、あなたが探している解決策になるかもしれないと思う:

IEnumerator<T> Cast<T>(IEnumerator iterator) 
{ 
    while (iterator.MoveNext()) 
    { 
     yield return (T) iterator.Current; 
    } 
} 

あなたはこのようなあなたのコードでそれを呼び出す:

... 
var cons = Cast<KeyValuePair<String, object>>(fields.GetEnumerator()); 
... 
+0

素敵な人:) – Olivier10178

+0

@Lee - それを宣言しても構いませんが、 'fields.GetEnumerator()'が非ジェネリック版を提供するので、あなたはまだキャストを行う必要があります。 –

+1

@HelmutD - 驚いたことに 'fields.GetEnumerator'は非ジェネリックな' IEnumerator'インターフェースを返すだけですが、列挙子をラップするのではなく、 'IEnumerable 'にソース配列をキャストしてアクセスできます。 – Lee

0

代わりにオブジェクト(または匿名オブジェクト)を使用してみませんか?

private Entity makeEntity(object obj) 
{ 
    Entity entity = new Entity(); 
    foreach(var kvp in new RouteValueDictionary(obj)) 
    { 
     entity.fields.Add(new Field {name=kvp.Key, values={new Value {value=kvp.Value}}); 
    } 

    return entity; 
} 

使用法は、ほとんどの場合、はるかに簡単です:

var x = makeEntity(new {Field1=Value1, Field2=Value2, Field3=Value3}); 
+0

おそらくこれをLINQ Selectの1回のリターンに変換することもできます。必要に応じてこれを短くすることもできますが、それはあなたに任せます。 'Entity.fields'が設定可能であると仮定します。 –

2

最も簡単な修正はconsの宣言された型に変更することです:あなただけの反復処理するためにforeachを使用する必要がありますしかし

IEnumerator<KeyValuePair<string, object>> cons = ((IEnumerable<KeyValuePair<string, object>>)fields).GetEnumerator(); 

を代わりに要素:

foreach(var kvp in fields) 
{ 
    ... 
} 
関連する問題