是否可以添加KeyValuePair<>作为C#中的params类型

时间:2017-06-28 15:38:18

标签: c# structure enumerable

正如标题所述;我有(如下所示)一个Structure类型的数组。 但是尝试从中提取数据并不起作用,因为它被评估为Object类型。 如果可能的话,如果可能的话,我真的很喜欢这种态度。

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

3 个答案:

答案 0 :(得分:2)

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

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

但是,您应该使用foreach来迭代元素:

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

答案 1 :(得分: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});

答案 2 :(得分:-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());
...