2017-06-28 4 views
0

Comme les états du titre; J'ai (montré ci-dessous) un tableau d'un type de structure. Mais tenter d'extraire des données ne fonctionne pas car il est évalué en tant que type Object. Si c'est impossible j'aimerais vraiment un morphisme de ceci si possible.Est-il possible d'ajouter KeyValuePair <> en tant que Type de paramètres en 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

Je crois que s'il y a un problème, il a quelque chose à voir avec .NET (le type 'objet'). – Olivier10178

+0

Avez-vous essayé de lancer 'cons.Current.Value' au type dont vous avez besoin avant de l'affecter à' value.value'? Sinon, je ne suis pas sûr de ne pas avoir compris ce que vous demandez :) –

+0

Expliquez ce que vous voulez faire. Le titre * ne m'aide pas du tout. 'params' a une syntaxe spécifique qui n'est pas utilisée ici. Vous dites explicitement que vous voulez recevoir des valeurs 'object'. Qu'est-ce que vous essayez de faire en premier lieu? Essayez-vous de passer un type 'dynamic' sans utiliser' dynamic'? –

Répondre

-2

Je pense que la fonction de coulée proposée dans

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

pourrait être la solution que vous cherchez:

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

Vous appelez dans votre code comme ceci:

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

Nice one man :) – Olivier10178

+0

@Lee - Vous pouvez le déclarer comme ça, mais vous devez toujours faire le casting, car 'fields.GetEnumerator()' vous donne la version non générique. –

+1

@HelmutD - De manière surprenante 'fields.GetEnumerator' ne renvoie que l'interface non générique' IEnumerator' mais vous pouvez y accéder en convertissant le tableau source en 'IEnumerable ' au lieu d'encapsuler l'énumérateur. – Lee

0

Pourquoi ne pas utiliser un objet (ou un objet anonyme) à la place?

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; 
} 

L'utilisation est beaucoup plus facile dans la plupart des cas:

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

Vous pouvez probablement même convertir cela en un seul retour d'un LINQ Select si vous voulez, ce qui serait encore plus court, mais je vous laisse le soin de le faire. En supposant que 'Entity.fields' est paramétrable. –

2

La solution la plus simple est de changer le type déclaré de cons:

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

Cependant, vous devez simplement utiliser foreach pour itérer les éléments à la place:

foreach(var kvp in fields) 
{ 
    ... 
}