[英]Check MethodInfo instance is implementation of interface generic method
我有界面
public interface ITest
{
Task<bool> MyMethod1<T>(string key, out T value);
Task<bool> MyMethod2<T>(string key, out T value);
}
他们实施
public class TestImpl : ITest
{
public Task<bool> MyMethod1<T>(string key, out T value) // Implements interface
{
// Skipped
}
public Task<bool> MyMethod1<T>(string key, T value) // Does not implements interface
{
// Skipped
}
public Task<bool> MyMethod2<T>(string key, out T value) // Implements interface
{
// Skipped
}
public Task<bool> MyMethod2<T>(string key, T value) // Does not implements interface
{
// Skipped
}
}
我需要检查MethodInfo的指定实例是否是ITest接口的方法实现。
例如:
void DoWork(MethodInfo methodInfo)
{
if (...) // Check methodInfo is implementation of any method declared in ITest interface
{
/* Do something */
}
}
怎么做?
我有个主意,但不知道是否适合您的情况
为什么不获得类的实现the class
,然后又通过其名称nameof(ITest)
获得感兴趣的接口,然后遍历由该类型实现的该接口的所有方法,如下所示:
foreach(var methodInfo in typeof(TestImpl).GetInterface(nameof(ITest)).GetMethods())
{
}
这是一个非常简单的主意,因为您没有在foreach
循环中对接口名称进行硬编码,这也很好。 如果不适合您的情况,请考虑为您的问题添加更多详细信息,以便我考虑其他想法并修改此答案,或者有人可以为您提供帮助。
编辑
或者,您可以通过属性ReflectedType
获取具体的类类型,然后可以使用GetInterfaceMap
方法根据特定的接口类型获取此类型的方法的“反射映射”,然后该方法将返回为此实现的方法在此具体类类型的接口类型中,然后您可以根据需要简单地使用Contains
方法检查特定的MethodInfo
实例。 希望这对您有所帮助。
static bool IsMethodImplementationOfInterface(Type interfaceType,MethodInfo method)
{
return method.ReflectedType.GetInterfaceMap(interfaceType).TargetMethods.Contains(method);
}
foreach (var methodInfo in typeof(TestImpl).GetMethods())
{
if (IsMethodImplementationOfInterface(typeof(ITest), methodInfo))
{
//Logic
}
}
您可以使用GetInterfaceMap:
var testImpl = new TestImpl();
var interfaceTargeMethods = testImpl.GetType().GetInterfaceMap(typeof(ITest)).TargetMethods;
foreach (var methodInfo in testImpl.GetType().GetMethods())
{
if (interfaceTargeMethods.Contains(methodInfo))
{
// do something...
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.