在我的代码中,我将获得一个类型对象,表示一个开放的通用类,它实现(至少)2个开放的通用接口。我知道这些接口中的至少一个(示例中的IGiveOneValue)。这是一个完整的,有效的例子:
using System;
namespace ConsoleApplication22
{
interface IGiveOneValue<T>
{
T Value { get; }
}
interface IGiveAnother<T>
{
T Value { get; }
}
class ValueImplementation<T1, T2> : IGiveOneValue<T1>, IGiveAnother<T2>
{
public ValueImplementation(T1 value1, T2 value2)
{
v1 = value1;
v2 = value2;
}
T1 v1;
T2 v2;
T1 IGiveOneValue<T1>.Value { get { return v1; } }
T2 IGiveAnother<T2>.Value { get { return v2; } }
}
class Program
{
static void Main(string[] args)
{
var genericArguments = typeof(ValueImplementation<,>).GetGenericArguments();
// genericArguments.Length == 2
// how can I tell which argument will fulfill IGiveOneValue<T>?
// assuming they could be implemented in any order
// these parameters might be in the wrong order:
var closedType = typeof(ValueImplementation<,>).MakeGenericType(new[] { typeof(int), typeof(string)});
var instance = Activator.CreateInstance(closedType, 1, "2");
}
}
}
如何使用反射来确定ValueImplementation中的哪些 open 泛型参数&lt;,&gt; class对应IGiveOneValue的成员,所以我可以在MakeGenericType方法中将特定类型传递给它?
答案 0 :(得分:2)
GetInterfaces方法将获取该类型的接口,并且它还允许您使用GetGenericArguments。因此,如果您想知道类型实现哪个接口使用哪种类型约束,您可以尝试:
var genericArguments = typeof(ValueImplementation<,>).GetGenericArguments();
var implementedInterfaces = typeof(ValueImplementation<,>).GetInterfaces();
foreach (Type _interface in implementedInterfaces) {
for (int i = 0; i < genericArguments.Count(); i++) {
if (_interface.GetGenericArguments().Contains(genericArguments[i])) {
Console.WriteLine("Interface {0} implements T{1}", _interface.Name, i + 1);
}
}
}
希望我能理解你的问题并提供一些指导。