如何在 C# 中使用泛型参数调用泛型方法

本文关键字:泛型 参数 调用 泛型方法 | 更新日期: 2023-09-27 18:32:22

我想知道如何在C#中使用反射来调用以下方法:

public static List<T> GetAllWithChildren<T>
    (this SQLiteConnection conn, Expression<Func<T, bool>> filter = null, bool recursive = false) 
    where T
    #if USING_MVVMCROSS: new() #else : class #endif
    {
    }

我当前的代码是:

MethodInfo methodInfo = typeof(ReadOperations).GetMethod("GetWithChildren", BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy);
Type predicateType = predicate.GetType();
MethodInfo genericMethod = methodInfo.MakeGenericMethod(predicateType);
Type[] genericArgumentsType = genericMethod.GetGenericArguments();
Debug.WriteLine("Arguments Number:" + genericArgumentsType.Count());
int count = 0;
foreach (Type ga in genericArgumentsType)
{
    Console.WriteLine(count++ + " " + ga.GetType());
}
Object[] genericArguments = { conn, predicate, true };
genericMethod.Invoke(conn, genericArguments);

返回的参数数为 1 ...这是错误的,但我不知道为什么系统会将这个号码返回给我。

调用方法失败,参数数错误。

欢迎任何帮助!

如何在 C# 中使用泛型参数调用泛型方法

你正在使用谓词的泛型参数使方法泛型。 这意味着:

Expression<Func<T, bool>>的泛型参数将Func<T, bool>这不是您要查找用于标记方法的实际类型。更新以下行:

Type predicateType = predicate.GetType();
MethodInfo genericMethod = methodInfo.MakeGenericMethod(predicateType);

Type parameterType = predicate.Parameters[0].Type;
MethodInfo genericMethod = methodInfo.MakeGenericMethod(parameterType);

这将为您提供来自Func<T,bool> T的类型。现在它应该按预期工作。

上述更改基于假设您的谓词属于 Expression<Func<T, bool>> 类型。如果谓词Func<T, bool>则参数类型可以像下面这样获取:

Type parameterType  = predicate1.GetType().GetGenericArguments()[0];

你用GetWithChildren而不是GetAllWithChildren来称呼它。

你的通用方法是扩展方法。更改以下代码,然后重试

MethodInfo methodInfo = typeof(**SQLiteConnection**).GetMethod("GetAllWithChildren", BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy);