如何在 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 ...这是错误的,但我不知道为什么系统会将这个号码返回给我。
调用方法失败,参数数错误。
欢迎任何帮助!
你正在使用谓词的泛型参数使方法泛型。 这意味着:
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);