我有以下代码:
public interface IInput
{
}
public interface IOutput
{
}
public interface IProvider<Input, Output>
{
}
public class Input : IInput
{
}
public class Output : IOutput
{
}
public class Provider: IProvider<Input, Output>
{
}
现在我想知道Provider是否使用反射实现IProvider? 我不知道该怎么做。 我尝试了以下方法:
Provider test = new Provider();
var b = test.GetType().IsAssignableFrom(typeof(IProvider<IInput, IOutput>));
返回false ..
我需要帮助。我想避免使用Type Name(String)来解决这个问题。
答案 0 :(得分:4)
测试它是否实现 :
var b = test.GetType().GetInterfaces().Any(
x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IProvider<,>));
要查找 ,请使用FirstOrDefault
代替Any
:
var b = test.GetType().GetInterfaces().FirstOrDefault(
x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IProvider<,>));
if(b != null)
{
var ofWhat = b.GetGenericArguments(); // [Input, Output]
// ...
}
答案 1 :(得分:0)
首先,IProvider
应该使用接口而不是定义中的类声明:
public interface IProvider<IInput, IOutput>
{
}
然后Provider
类定义应为:
public class Provider: IProvider<IInput, IOutput>
{
}
最后对IsAssignableFrom
的调用是倒退的,应该是:
var b = typeof(IProvider<IInput, IOutput>).IsAssignableFrom(test.GetType());
答案 2 :(得分:-1)
我能够使用马克的建议来实现这一目标。
以下是代码:
(type.IsGenericType &&
(type.GetGenericTypeDefinition() == (typeof(IProvider<,>)).GetGenericTypeDefinition()))