如何在C#中覆盖KeyValuePair <tkey,tvalue =“”>?

时间:2015-07-25 17:58:04

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

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

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

2 个答案:

答案 0 :(得分:2)

您可以使用object作为您的类型,然后转换为object /从DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } 转换为所需的结果。但是,重要的是要注意这与面向对象编程非常相反,并且通常表示您的设计和体系结构中存在错误。

答案 1 :(得分:0)

嗯,我想知道这是否可能对你有所帮助:要获得你想要的列表,确实可能但是“var”类型(如你所知)对于所有KeyValuePair实例必须是相同的。对于任何类型,你必须使用对象或动态(使用哈尼的答案)。

因此,考虑到您需要所有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"});

ideea依赖于我们在C#中拥有的强大的类型推断功能。 一些说明:

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

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