是否可以在 C# 中添加 KeyValuePair<> 作为参数类型

Is it possible to add KeyValuePair<> as Type of params in C#

如标题所述;我有(如下所示)一个结构类型的数组。 但是尝试从中提取数据是行不通的,因为它被评估为 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;
    }

我认为

中提出的转换功能

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());
...

为什么不使用对象(或匿名对象)呢?

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

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

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

但是您应该只使用 foreach 来遍历元素:

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