gpt4 book ai didi

c# - 如何在 C# 中调用带有泛型参数的泛型方法?

转载 作者:行者123 更新时间:2023-11-30 23:30:09 25 4
gpt4 key购买 nike

我想知道如何在 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……说错了,但我不知道为什么系统会返回给我这个数字。

调用方法因参数数量错误而失败。

欢迎任何帮助!

最佳答案

您正在使用 Predicate 的通用参数来使方法通用。这意味着:

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

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

以上更改基于假设您的谓词类型为 Expression<Func<T, bool>> .如果谓词是 Func<T, bool>然后可以像下面这样获取参数类型:

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

关于c# - 如何在 C# 中调用带有泛型参数的泛型方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35065461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com