当前位置:  开发笔记 > 编程语言 > 正文

测试对象是否是C#中的字典

如何解决《测试对象是否是C#中的字典》经验,为你挑选了2个好方法。

有没有办法测试对象是否是字典?

在一个方法中,我试图从列表框中的选定项目中获取值.在某些情况下,列表框可​​能绑定到字典,但在编译时不知道.

我想做类似的事情:

if (listBox.ItemsSource is Dictionary)
{
    KeyValuePair pair = (KeyValuePair)listBox.SelectedItem;
    object value = pair.Value;
}

有没有办法在运行时使用反射动态地执行此操作?我知道可以使用泛型类型的反射并确定键/值参数,但我不确定在检索这些值之后是否有办法完成其余的操作.



1> Guvante..:

检查它是否实现了IDictionary.

请参阅System.Collections.IDictionary的定义以查看它为您提供的内容.

if (listBox.ItemsSource is IDictionary)
{
    DictionaryEntry pair = (DictionaryEntry)listBox.SelectedItem;
    object value = pair.Value;
}

编辑: 当我意识到KeyValuePair不能转换为DictionaryEntry时的替代方案

if (listBox.DataSource is IDictionary)
{
     listBox.ValueMember = "Value";
     object value = listBox.SelectedValue;
     listBox.ValueMember = ""; //If you need it to generally be empty.
}

此解决方案使用反射,但在这种情况下,您不必执行繁琐的工作,ListBox会为您执行此操作.此外,如果您通常将字典作为数据源,则可以避免一直重置ValueMember.


嗯,你知道IDictionary 实际上并没有实现IDictionary接口吗?所以这对通用词典不起作用.请查看http://msdn.microsoft.com/en-us/library/s4ys34ea.aspx

2> Greg Beech..:

它应该类似于以下内容.我在答案框中写了这个,所以语法可能不完全正确,但我已经将它编辑为Wiki,所以任何人都可以解决.

if (listBox.ItemsSource.IsGenericType && 
    typeof(IDictionary<,>).IsAssignableFrom(listBox.ItemsSource.GetGenericTypeDefinition()))
{
    var method = typeof(KeyValuePair<,>).GetProperty("Value").GetGetMethod();
    var item = method.Invoke(listBox.SelectedItem, null);
}

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有