如何在 C# 中覆盖 KeyValuePair<TKey, TValue>?

How to override KeyValuePair<TKey, TValue> in C#?

我想在 C# 中覆盖 KeyValuePair 的默认结构,这样我就可以使 KeyValuePair 接受 'var' 类型。

像这样:

List<KeyValuePair<string, var>> kvpList = new List<KeyValuePair<string, var>>()
                {
                    new KeyValuePair<string, var>("Key1", 000),
                    new KeyValuePair<string, var>("Key2", "value2"),
                    new KeyValuePair<string, var>("Key3", 25.45),
                };

即使它可以用于字典,也可以解决我的问题。

您可以使用 object 作为您的类型,然后将 to/from object 转换为所需的结果。但是,请务必注意,这与面向对象编程截然相反,通常表示您的设计和架构存在错误。

嗯,我想知道这是否对您有帮助:要获得您想要的列表,确实有可能,但是所有 KeyValuePair 实例的 "var" 类型(如您命名的)必须相同。对于任何类型,您必须使用 object 或 dynamic(使用 Haney 的回答)。

因此考虑到您希望所有 KeyValuePair 实例都使用单一类型,这里有一个解决方案:

首先,创建这个助手class:

public static class KeyValuePairExtentions
{
    public static List<KeyValuePair<string, T>> GetNewListOfType<T>(Expression<Func<T>> type)
    {
        return new List<KeyValuePair<string, T>>();
    }

    public static void AddNewKeyValuePair<T>(this List<KeyValuePair<string, T>> @this, string key, T element)
    {
        @this.Add(new KeyValuePair<string, T>(key, element));
    }
}

要使用这些函数,这里有一个例子:

var lst = KeyValuePairExtentions.GetNewListOfType(() => new {Id = default (int), Name = default (string)});

lst.AddNewKeyValuePair("test1", new {Id = 3, Name = "Keith"});

idea 是依赖于我们在 C# 中拥有的强大的类型推断功能。 一些注意事项:

1) 如果 T 是匿名的,并且您在一个程序集中创建了一个列表的新实例并在另一个程序集中使用它,那么这很可能不起作用,因为每个程序集都编译了一个匿名类型(换句话说,如果你在程序集中有一个变量 var x = new { X = 3 } 而在另一个 var y = new { X = 3 } 那么 x.GetType () != y.GeTType ( ) 但在相同的装配类型中是相同的。)

2) 如果您想知道它是否通过调用 GetNewListOfType 创建了一个实例,答案是否定的,因为它是一个表达式树函数,而且该函数甚至没有被编译。即使使用 Func 也可以工作,因为我没有在我的代码中调用该函数。我使用该函数只是为了类型推断。