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# 中实现此目的?
我认为你应该在这里使用协变。 如果你不熟悉泛型中的协方差和逆变,我建议你阅读这篇文章: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>
,所以你在编译时不知道任何值的基础类型是什么。
如果这是不可能的,那么唯一的方法是将字典的值类型切换为 object
或 dynamic
并将所有类型检查推迟到运行时(通过反射或动态绑定,恭敬地)。
初始化字典时,需要传递两个参数键和值。在您的示例中,我清楚地看到了您要添加的值
var props = new Dictionary<string, Property<object>>(); //correct
props.Add(prop1);//where is the Key??
但钥匙在哪里?