我有一个泛型类:
Property<T>
我想将Property对象添加到字典中,但我没有这样做:
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<?>>();
那将采取Property&lt; String&gt;和属性&lt; Boolean&gt; ...
如何在C#中实现这一目标?
答案 0 :(得分:1)
我认为你应该在这里使用Covariant。如果你不熟悉泛型中的协方差和逆变,我建议你阅读这篇文章:https://msdn.microsoft.com/en-us/library/dd799517(v=vs.110).aspx详细描述它们。因此,为了与您合作,我建议您只应将类更改为Property<out T> to IProperty<out T>
的界面,并尝试一下。告诉我它是否适合你。
快乐的编码。
答案 1 :(得分:0)
如何在C#中实现这一目标?
你可能能够定义Property<T>
实现的协变接口,但接口只能包含输出 T
的方法和属性 - 它不能像输入中那样接受T
(或任何衍生物)的方法或属性设置器。即使这样,你的vale类型也会像IProperty<object>
那样,所以你在编译时不知道任何值的基础类型是什么。
如果那不可能,那么唯一的方法是将字典的值类型切换为object
或dynamic
,并将所有类型检查推迟到运行时(通过反射或动态)尊重地约束。
答案 2 :(得分:0)
您几乎使用协变接口完成此操作,但无法使用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);
...
答案 3 :(得分:0)
初始化Dictionary时,需要传递两个参数Key和Value。在您的示例中,我清楚地看到了您要添加的值
var props = new Dictionary<string, Property<object>>(); //correct
props.Add(prop1);//where is the Key??
但Key在哪里?