好的,这就是问题所在。比较两种不同方法的返回类型时遇到问题。
第一种方法被硬编码为特定的泛型类型,因此当您获得有关方法返回类型的信息时,它会包含该类型。这就是我的意思。
public Task<Message> GetMessage(long id)
{
...
return await getEntityFromDbById<Message>(id); //generic type is hard coded to type Message
}
如果你获得方法信息this.GetType().GetTypeInfo().GetDeclaredMethod("GetMessage").ReturnType.ToString()
,并查看它的返回类型,这就是你得到的
System.Threading.Tasks.Task`1[Core.Models.Message]
现在,我的第二种方法是通用的,看起来像这样。
public Task<T> GetEntityById<T>(long id) where T : class, IEntity
{
...
return await getEntityFromDbById<T>(id); // generic type is passed in
}
现在,如果您获得此方法的ReturnType信息,则可以获得
System.Threading.Tasks.Task`1[T]
我在运行时尝试做的是获取T
的类型信息,并将其与仅使用MethodInfo类型的其他方法进行比较。如何做到这一点?
public bool compareMethods(MethodInfo method1, MethodInfo method2)
{
...
//Won't work because one method has a generic return type.
//How do you detect and compare?
return method1.ReturnType == method2.ReturnType;
}
答案 0 :(得分:1)
给定类型引用,您可以使用方法GetGenericArguments()
访问引用泛型类型参数的信息类型,该方法将返回泛型参数的类型引用数组。
MethodInfo
定义了相同的方法。由于您的声明中只有一个通用参数,因此您实际上只需编写:
public bool compareMethods(MethodInfo method1, MethodInfo method2)
{
return method1.GetGenericArguments()[0] == method2.GetGenericArguments()[0];
}