类中的泛型属性

时间:2015-05-17 18:28:39

标签: c# generics keyvaluepair

我有一个具有2个属性键和值的类,key将始终用作字符串类型,但value属性的值必须是通用的。

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

谁能告诉我怎么能实现这个目标。以下是课程:

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

3 个答案:

答案 0 :(得分:1)

简短的回答是:

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

长篇文章是:为什么不将System.Collections.Generic.KeyValuePair<TKey,TValue>结构与string用于TKey以及对TValue有用的内容?

您的通用类示例:

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

答案 1 :(得分:1)

如果您不知道如何执行此操作,建议您在继续之前进一步阅读泛型(开始here)。为了启发你,它将通过以下代码实现。

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

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

答案 2 :(得分:1)

你不能完全,这不行。

想象一下,可以编写以下内容:

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

但如果您考虑这样做,那么明显会遇到设计问题,因为这对<{1}}类型的属性没有任何优势

以下是使用object的解决方案:

KeyValuePair<string, object>

这是一个demo