c# generics Property<string> in Dictionary<string,

本文关键字:lt string Dictionary in gt Property generics | 更新日期: 2023-09-27 18:32:04

我有一个泛型类型的类:

Property<T>

我想将属性对象添加到字典中,但未能这样做:

var prop1 = new Property<string>("hello");
var prop2 = new Property<bool>(false);
var props = new Dictionary<string, Property<object>>();
props.Add("prop1",prop1); <-- this does not compile
props.Add("prop2",prop2);

我得到:

cannot convert from 'Core.Property<string>' to type 'Core.Property<object>'

在Java中,我会使用

Map<String, Property<?>> props = new HashMap<String, Property<?>>();

这将需要属性<字符串>和属性<布尔值>...

如何在 C# 中实现此目的?

c# generics Property<string> in Dictionary<string,

我认为你应该在这里使用协变。 如果你不熟悉泛型中的协方差和逆变,我建议你阅读这篇文章:https://msdn.microsoft.com/en-us/library/dd799517(v=vs.110).aspx它详细描述了它们。因此,为了与您合作,我建议您只将类更改为像这样的界面Property<out T> to IProperty<out T> 并尝试一下。告诉我它是否适合你。快乐编码。

几乎可以用协变接口来实现这一点,但它不适用于 bool 属性,因为它是一个基元。

您可以按如下方式设置界面:

public interface IProperty<out T> {
    T GetValue();
}
public class Property<T> : IProperty<T> {
    private T value;
    public Property(T value) { this.value = value; }
    public T GetValue() { return this.value; }
}

对于字符串属性,字典将如下所示:

...
IProperty<string> prop1 = new Property<string>("hello");
var props = new Dictionary<string, IProperty<object>>();
props.Add("Test1", prop1); 
...

如何在 C# 中实现此目的?

也许能够定义Property<T>实现的协变接口,但该接口只能包含输出T的方法和属性 - 它不能具有接受输入中的T(或任何导数)的方法或属性 setter。 即便如此,你的 vale 类型也会像 IProperty<object> ,所以你在编译时不知道任何值的基础类型是什么。

如果这是不可能的,那么唯一的方法是将字典的值类型切换为 objectdynamic并将所有类型检查推迟到运行时(通过反射或动态绑定,恭敬地)。

初始化字典时,需要传递两个参数键和值。在您的示例中,我清楚地看到了您要添加的值

var props = new Dictionary<string, Property<object>>(); //correct
props.Add(prop1);//where is the Key??

但钥匙在哪里?