如何获取给定方法

时间:2016-03-26 00:42:13

标签: c# generics reflection win-universal-app

好的,这就是问题所在。比较两种不同方法的返回类型时遇到问题。

第一种方法被硬编码为特定的泛型类型,因此当您获得有关方法返回类型的信息时,它会包含该类型。这就是我的意思。

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; 
}

1 个答案:

答案 0 :(得分:1)

给定类型引用,您可以使用方法GetGenericArguments()访问引用泛型类型参数的信息类型,该方法将返回泛型参数的类型引用数组。

MethodInfo定义了相同的方法。由于您的声明中只有一个通用参数,因此您实际上只需编写:

public bool compareMethods(MethodInfo method1, MethodInfo method2)
{
    return method1.GetGenericArguments()[0] == method2.GetGenericArguments()[0]; 
}