C# 对IDictionary的反思';不要透露任何关于KeyValuePair的信息

C# 对IDictionary的反思';不要透露任何关于KeyValuePair的信息,c#,.net,reflection,C#,.net,Reflection,我使用接口上的反射来确定实现类型中哪些方法来自接口(vs重载不是来自接口)。这对于系统程序集非常有效,除了一种情况:System.Collections.Generic.IDictionary 从MSDN中我知道,IDictionary实现了ICollection,但我无法通过反射找到任何可以找到“KeyValuePair”的地方。目前,我正在为IDictionary使用一些特定的逻辑来解决这个问题,但我希望能够像对待其他接口一样对待IDictionary,而不必直接编写这种特性的代码 下面是一

我使用接口上的反射来确定实现类型中哪些方法来自接口(vs重载不是来自接口)。这对于系统程序集非常有效,除了一种情况:
System.Collections.Generic.IDictionary

从MSDN中我知道,
IDictionary
实现了
ICollection
,但我无法通过反射找到任何可以找到“KeyValuePair”的地方。目前,我正在为IDictionary使用一些特定的逻辑来解决这个问题,但我希望能够像对待其他接口一样对待IDictionary,而不必直接编写这种特性的代码

下面是一个代码片段(请记住,除了泛型IDictionary之外,它实际上总是有效的):

foreach(SystemAssembly.GetExportedTypes()中的System.Type asmType)
{
if(asmType.IsInterface)
{
//System.Type对象中是否有任何东西会告诉我接口实现了ICollection?
//此时,我调用“GetMethods”,对于需要KeyValuePair参数的IDictionary方法,我将使用System.Object参数
foreach(asmType.GetMethods(…绑定标志…)中的MethodInfo方法)
{
ParameterInfo[]parameters=method.GetParameters();
...
}
}
}

解决方案:Lee的回答很准确-我终于可以通过反射看到“KeyValuePair”。

如果您有open
IDictionary
类型的类型实例,您可以执行以下操作:

Type dictType = typeof(IDictionary<,>);
var icolIface = dictType.GetInterfaces()
                .First(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(ICollection<>));

Type colType = icolIface.GetGenericArguments()[0];
Type dictType=typeof(IDictionary);
var icolIface=dictType.GetInterfaces()
.First(i=>i.IsGenericType&&i.GetGenericTypeDefinition()==typeof(ICollection));
类型colType=icolIface.GetGenericArguments()[0];

这个小片段显示了用于从字典中获取
KeyValuePair
类型的方法调用和属性

var someDictionary = new Dictionary<int, string>();

var kvType = someDictionary.GetType().GetInterfaces()
  .Single(i => i.Name == "ICollection`1")
  .GetGenericArguments().Single();
var someDictionary=newdictionary();
var kvType=someDictionary.GetType().GetInterfaces()
.Single(i=>i.Name==“ICollection`1”)
.GetGenericArguments().Single();

因为我不知道你到底在追求什么,我硬编码了从实现的接口中选择的
ICollection`1
接口。

请显示你正在使用的代码。。。请注意,
IDictionary
IDictionary
是非常不同的类型。您看到的是
IDictionary
@leppie的非通用版本:(感谢您的编辑)。看见问题是如何仅通过反射来确定这一点。@leppie:不,请参阅我提供的链接。@DaveDoknjas:“不多”与“没有”不同。你声称你到处都是反射,没有看到你所期望的-这意味着你应该能够提供一个简短但完整的程序,你希望它显示一件事,但它实际上显示了另一件事。当我收集反射信息时,我不知道IDictionary泛型类型使用的具体类型(例如,我不知道“string,string”)。@DaveDoknjas-如果
dictType
typeof(IDictionary)
colType
将是
KeyValuePair
,它仍然可以工作。我想找到那个“KeyValuePair”不需要对特定类型进行硬编码,例如“int,string”。+1@DaveDoknjas使用
typeof(IDictionary).GetInterfaces()。。。由于您没有显示您的代码,因此很难对您的输入进行推理。更新代码,以便更清楚地了解如何从变量开始。
var someDictionary = new Dictionary<int, string>();

var kvType = someDictionary.GetType().GetInterfaces()
  .Single(i => i.Name == "ICollection`1")
  .GetGenericArguments().Single();