类中的泛型属性

本文关键字:属性 泛型 | 更新日期: 2023-09-27 17:49:25

我有一个类,它有2个属性键和值,键将始终用作字符串类型,但是value属性的值需要是通用的。

所以我想为属性而不是类创建一个泛型类型,因为如果我为类创建一个泛型,我为类使用的类型将用于所有属性的泛型列表类中的所有项。

谁能告诉我怎样才能做到这一点?下面是类:

   public class KeyValuePairs
    {
        public string Key { get; set; }
        public object Value { get; set; }
    }

类中的泛型属性

你不能完全做到,这是行不通的

想象你可以写以下内容:

public class KeyValuePairs
{
    public string Key { get; set; }
    public T Value<T> { get; set; }
}

在下面的代码中,foo变量的类型是什么?

var pair = new KeyValuePairs();
var foo = pair.Value;

好,现在让我们假设语言允许这样做:

var pair = new KeyValuePairs();
var foo = pair.Value<int>;

嗯…下面的代码将如何表现?

var pair = new KeyValuePairs();
pair.Value = new Thread();
var foo = pair.Value<int>;

可以看到,语言不允许这样做是有原因的。


当然,你可以这样做:

public class KeyValuePairs<TValue>
{
    public string Key { get; set; }
    public TValue Value { get; set; }
}

(或者直接用System.Collections.Generic.KeyValuePair<string, TValue>)

或者您可以用方法对替换该属性:

// Warning: bad code!
public class KeyValuePairs<TValue>
{
    private object _value;
    public string Key { get; set; }
    public TValue GetValue<TValue>()
    {
        return _value;
    }
    public void SetValue<TValue>(TValue value)
    {
        _value = value;
    }
}

但是如果你考虑这样做的话,显然有一个设计问题,因为object类型的属性相比没有任何优势


使用KeyValuePair<string, object>:

var list = new List<KeyValuePair<string, object>>();
list.Add(new KeyValuePair<string, object>("string", "Hello, World!"));
list.Add(new KeyValuePair<string, object>("int", 42));
list.Add(new KeyValuePair<string, object>("bool", true));
foreach (var item in list)
    Console.WriteLine("[{0}] = {1}", item.Key, item.Value);

这里有一个演示

简短的回答是:

public class KeyValuePairs<TValue>
{
    public string Key { get; set; }
    public TValue Value { get; set; }
}

长一个是:为什么你不使用System.Collections.Generic.KeyValuePair<TKey,TValue>结构与string TKeyTValue有用的东西?

泛型类的示例:

var key = new KeyValuePairs<int>{ Key = "abc", Value = 123 };

我将使键不可变,因为一旦对象被添加到依赖于键的集合中就改变它不是一个好主意:

public class KeyValuePairs<TValue>
{
    public KeyValuePairs(string key, TValue value)
    {
        _key = key;
        Value = value;
    }
    private readonly string _key;
    public string Key { get { return _key; } }
    public TValue Value { get; set; }
}

的例子:

var key = new KeyValuePairs<int>("abc", 123);

如果您不知道如何做到这一点,我建议您在继续之前进一步阅读泛型(从这里开始)。为了启发您,它将通过以下代码实现。

public class KeyValuePairs<T>
{
    public string Key { get; set; }
    public T Value { get; set; }
}

但是,这样的类已经存在于System.Collections.Generic命名空间中。KeyValuePair .