【发布时间】:2017-01-30 20:23:23
【问题描述】:
我是 C# 新手。我正在尝试在 C# 中实现一个字典,其 Java 等效项是:
HashMap<string, Variable<?>> dictionary
这是我正在尝试做的详细 Java 版本:Java how to manage user-defined variables
到目前为止,在 C# 中我有这样的东西:
interface IVariable { }
public class Variable<T> : IVariable
{
public T myValue { get; set; }
}
Dictionary<string, IVariable> vars = new Dictionary<string, IVariable>();
然后我尝试这样做:
Variable<int> age = new Variable<int>();
age.myValue = 12;
vars.Add("age", age);
IVariable theVar;
if (vars.TryGetValue("age", out theVar) {
Console.WriteLine("fetched age is " + theVar.myValue);
}
我在最后一行遇到了麻烦,因为编译器无法识别theVar 的myValue 成员,因为它是IVariable。
在这个简单的例子中,也许我可以将theVar 声明为Variable<int> 而不是IVariable,但我没有尝试过,因为它需要先验知识我从中获取的变量类型字典,我可能并不总是有这些知识。
我不介意myValue 是否是继承/抽象属性(如果有的话),因为每个变量都有一个名为myValue 的属性(每个变量的类型不同,但名称不同)。在这种情况下,我想我可以将IVariable 设为abstract class 而不是interface,但我仍然会遇到麻烦,要为myValue 类型添加什么。
我可以先用is 检查它的类型,然后使用as 将theVar 转换成一个东西吗?我不确定这是否可行,甚至可能。
我查看了这些帖子以获得指导(尤其是第二个):
Wildcard equivalent in C# generics
但是,我的情况仍然与上面的第二个示例略有不同,因为该示例有一个返回 void 的抽象方法,而我希望我的变量返回非 void 泛型值。
感谢您的帮助。
【问题讨论】:
标签: c# dictionary generics wildcard