有没有办法测试对象是否是字典?
在一个方法中,我试图从列表框中的选定项目中获取值.在某些情况下,列表框可能绑定到字典,但在编译时不知道.
我想做类似的事情:
if (listBox.ItemsSource is Dictionary?>) { KeyValuePair?> pair = (KeyValuePair?>)listBox.SelectedItem; object value = pair.Value; }
有没有办法在运行时使用反射动态地执行此操作?我知道可以使用泛型类型的反射并确定键/值参数,但我不确定在检索这些值之后是否有办法完成其余的操作.
检查它是否实现了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.
它应该类似于以下内容.我在答案框中写了这个,所以语法可能不完全正确,但我已经将它编辑为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); }