我正在使用Dictionary<string, string>
作为乐器的配置,对于那些对编程知之甚少的用户来说,能够从Visual Studio中获得自动完成功能会更容易。
在Python中,我可以创建一个Dictionary并使用点运算符访问不同的值。
d = {'name':'Joe', 'mood':'grumpy'}
d.name
d.mood
C#有办法做到这一点吗?
我意识到所有涉及的问题,因为字典只是一个通用的集合(如何通用?它只是一个KeyValuePairs列表?有趣的问题)。我不打算为此完成它的包装类(我希望它比使用自定义类的显式属性更灵活)。
答案 0 :(得分:4)
您已经可以使用匿名类型在C#中执行此操作:
var d = new { name = "Joe", mood = "grumpy"};
d.name
d.mood
或真实类型:
var d = new Person { Name = "Joe", Mood = "grumpy"};
d.Name
d.Mood
而且,在C#4.0中,我们将使用DLR,它允许在运行时使用ExpandoObject添加属性:
dynamic d = new ExpandoObject();
d.name = "Joe";
d.mood = "grumpy";
但是,我不确定您是否可以在C#中使用静态分析来执行IntelliSense。
最接近你所拥有的C#
var d = new Dictionary<string, string()
{ { "name", "Joe" }, { "mood", "grumpy" } };
d["name"]
d["mood"]
哪些不支持IntelliSense。
如果您正在制作API,我会使用真实的类型。
答案 1 :(得分:0)
好像你想要一个结构。 http://msdn.microsoft.com/en-us/library/0taef578.aspx
编辑:更改为更新的链接。
答案 2 :(得分:0)
你正在寻找imo方法链接。
Method chaining - why is it a good practice, or not?
字典对象是键值对的集合(使用列表),它还实现了用于访问的哈希表。就访问速度而言,它几乎是n(1)。
public class Dictionary<TKey, TValue> : IDictionary<TKey, TValue>,
ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>,
IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback
取自
MS-帮助://MS.VSCC.v90/MS.MSDNQTR.v90.en/fxref_mscorlib/html/589059d3-d7f8-e09b-705d-91a461971cc2.htm
实际上,检索算法随着哈希表变得越来越大而变化,因为哈希表对于少量项目的效率较低。
linq方法也适用 - 不需要使用匿名类型
moodyPerson p = new moodyPerson{mood = "good", name="jim"};
然而,这并不会强迫您设置一个喜怒无常的人的所有属性,并将使用其空构造函数。
如果要按字符串访问属性,则无法使用智能感知。您需要使用反射来实现此目的。
答案 3 :(得分:0)
如果您计划在运行时实例化对象(比如从数据库调用),请不要使用ExpandoObject()获得精心设计的解决方案,没有“点符号”的智能感知,它会产生编译错误如果你试图使用它。您可以使用[“propname”]括号表示来访问它们,但此时您可能已经创建了自定义类对象,或者只是根据需要在DataTable()中操作值