2017-06-28 42 views
0

正如标题所述;我有(如下所示)一个Structure类型的数组。 但试图从中提取数据不起作用,因为它被评估为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'?否则我不确定我不喜欢你问的问题:) –

+0

解释你想要做什么。标题*完全没有帮助。 'params'有一个特定的语法,这里没有使用。你明确地说你想接收'object'值。你首先想做什么?你是否试图通过'动态'类型而不使用'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的单个返回值,这会更短,但是我会把它留给你。假设'Entity.fields'是可以设置的。 –

2

最简单的解决方法是改变cons声明类型:

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

然而,你应该只使用foreach遍历元素代替:

foreach(var kvp in fields) 
{ 
    ... 
} 
相关问题