gpt4 book ai didi

c# - 获取方法的 MethodInfo - 此操作仅对泛型类型有效

转载 作者:太空狗 更新时间:2023-10-30 01:01:12 25 4
gpt4 key购买 nike

我有以下两个 Entity Framework 的 Include 方法:

public static IIncludableQueryable<TEntity, TProperty> Include<TEntity, TProperty>(
[NotNullAttribute] this IQueryable<TEntity> source,
[NotNullAttribute] Expression<Func<TEntity, TProperty>> navigationPropertyPath)
where TEntity : class;

public static IQueryable<TEntity> Include<TEntity>(
[NotNullAttribute] this IQueryable<TEntity> source,
[NotNullAttribute][NotParameterized] string navigationPropertyPath)
where TEntity : class;

我需要获取两种方法的 MethodInfo。对于我使用的第一个:

  MethodInfo include1 = typeof(EntityFrameworkQueryableExtensions)
.GetMethods().First(x => x.Name == "Include" && x.GetParameters()
.Select(y => y.ParameterType.GetGenericTypeDefinition())
.SequenceEqual(new[] { typeof(IQueryable<>), typeof(Expression<>) }));

这行得通,但是当我尝试使用以下方法获取第二个时:

  MethodInfo include2 = typeof(EntityFrameworkQueryableExtensions)
.GetMethods().First(x => x.Name == "Include" && x.GetParameters()
.Select(y => y.ParameterType.GetGenericTypeDefinition())
.SequenceEqual(new[] { typeof(IQueryable<>), typeof(String) }));

我得到错误:

This operation is only valid on generic types

我错过了什么?

最佳答案

好吧,让我们把它分开。首先你想获得方法的所有重载:

var overloads = typeof(EntityFrameworkQueryableExtensions)
.GetMethods()
.Where(method => method.Name == "Include");

然后您希望将参数类型与特定序列相匹配,以便您可以选择适当的重载。您的代码的问题在于您假设所有参数都是泛型类型,而事实并非如此。您可以使用三元子句来区分泛型和非泛型参数类型:

var include2 =  overloads.Where(method => method
.GetParameters()
.Select(param => param.ParameterType.IsGenericType ? param.ParameterType.GetGenericTypeDefinition() : param.ParameterType)
.SequenceEqual(new[] { typeof(IQueryable<>), typeof(string) }));

如预期的那样,这会产生第二个重载,并且不会提示您试图从第二个参数调用 typeof(string) 上的 GetGenericTypeDefinition

关于c# - 获取方法的 MethodInfo - 此操作仅对泛型类型有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40724892/

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