首页 / C# / C#中的动态字典用法
C#中的动态字典用法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#中的动态字典用法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2373字,纯文字阅读大概需要4分钟。
内容图文
![C#中的动态字典用法](/upload/InfoBanner/zyjiaocheng/688/5ae70f047b3d407984ff2843755d5cd9.jpg)
我在C#中使用动态字典.我面临的问题是TryGetMember的行为,该行为在动态字典类中被覆盖.
这是动态字典的代码.
class DynamicDictionary<TValue> : DynamicObject
{
private IDictionary<string, TValue> m_dictionary;
public DynamicDictionary(IDictionary<string, TValue> a_dictionary)
{
m_dictionary = a_dictionary;
}
public override bool TryGetMember(GetMemberBinder a_binder, out object a_result)
{
bool returnValue = false;
var key = a_binder.Name;
if (m_dictionary.ContainsKey(key))
{
a_result = m_dictionary[key];
returnValue = true;
}
else
a_result = null;
return returnValue;
}
}
在这里,每当我们从外部引用某个键时,都会在运行时调用TryGetMember,但奇怪的是,活页夹的Name成员始终提供从外部引用的键,它始终解析以字母字符形式书写的键名.
例如如果DynamicDictionary的对象为:
Dictionary<string,List<String>> dictionaryOfStringVsListOfStrings;
//here listOfStrings some strings list already populated with strings
dictionaryOfStringVsListOfStrings.Add("Test", listOfStrings);
dynamic dynamicDictionary_01 = new
DynamicDictionary<List<String>(dictionaryOfStringVsListOfStrings);
string somekey = "Test";
//will be resolve at runtime
List<String> listOfStringsAsValue = dynamicDictionary_01.somekey
现在,这里发生的是“ somekey”将成为a_binder的值(即a_binder.Name =“ somekey”).应该将其解析为a_binder.Name =“ Test”,然后从动态字典中将针对此键定位listOfStrings(即,实际上是“ Test”,但它不解析值,而是将实际的变量名解析为键).
有没有解决的办法?
解决方法:
动态类型化的目的是使成员名称本身从源代码成员访问中得到解析.
动态类型的工作方式与此处的含义完全相同-它并非旨在检索变量的值并将其用作成员名称-它旨在使用您在源代码中使用的成员名称(即“ somekey”).
听起来您真的根本不需要动态输入-只需使用Dictionary< string,List< String>>像平常一样:
List<String> listOfStringsAsValue = dictionary[somekey];
编辑:听起来您实际上想封装一个像这样的字典:
public class Foo // TODO: Come up with an appropriate name :)
{
private readonly Dictionary<string, List<string>> dictionary =
new Dictionary<string, List<string>>();
public List<string> this[string key]
{
get
{
List<string> list;
if (!dictionary.TryGetValue(key, out list))
{
list = new List<string>();
dictionary[key] = list;
}
return list;
}
}
}
然后,您可以执行以下操作:
foo["first"].Add("value 1");
foo["second"].Add("value 2")
foo["first"].Add("value 1.1");
如果您希望能够尝试获取列表而不创建新列表(如果该列表不存在),则可以添加一种方法来执行此操作.
听起来好像真的不需要这里的DynamicObject.
内容总结
以上是互联网集市为您收集整理的C#中的动态字典用法全部内容,希望文章能够帮你解决C#中的动态字典用法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。