【问题标题】:How to override KeyValuePair<TKey, TValue> in C#?如何在 C# 中覆盖 KeyValuePair<TKey, TValue>?
【发布时间】:2015-07-27 14:51:55
【问题描述】:

我想覆盖 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),
                };

即使它可能用于字典,那么它也将解决我的问题。

【问题讨论】:

  • var 不是类型...正如Haney 所说,如果您只想接受任何(非指针)类型,则可以改用object。值得您阅读更多关于 var 在 C# 中的真正含义。
  • 感谢您的宝贵回答/评论让我明白什么是可能的,什么是不可能的。
  • 你似乎还是没有理解我的意思——var 不是类型。没有“var 类型列表”之类的东西。
  • 糟糕,是的,我现在明白了。

标签: list c#-4.0 var keyvaluepair custom-data-type


【解决方案1】:

您可以使用object 作为您的类型,然后将object 转换为/从object 转换为所需的结果。但是,重要的是要注意,这与面向对象编程完全相反,通常表明您的设计和体系结构存在错误。

【讨论】:

  • 感谢您的宝贵回答/评论让我明白什么是可能的,什么是不可能的。
【解决方案2】:

嗯,我想知道这是否对您有帮助:要拥有一个您想要的列表,这确实是可能的,但是“var”类型(如您所命名的那样)对于所有 KeyValuePair 实例必须相同。对于任何类型,您必须使用对象或动态(使用 Haney 的答案)。

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

首先,创建这个帮助类:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 2011-01-16
    • 2013-08-12
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多