c#generics Dictionary <string,property <object =“”>&gt;中的属性<string>

时间:2016-01-26 20:56:22

标签: c# generics dictionary casting

我有一个泛型类:

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#中实现这一目标?

4 个答案:

答案 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>那样,所以你在编译时不知道任何值的基础类型是什么。

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

答案 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在哪里?