【发布时间】:2018-08-13 23:48:37
【问题描述】:
我需要使用仅在运行时可用的 TKey 值调用 OrderBy<T, TKey>(Func<T, TKey>) 方法。在阅读了关于如何将变量用作通用参数的答案后,我正在尝试以下方法:
string key = "MyProperty";
Type keyType = typeof(T).GetProperty(key).PropertyType;
MethodInfo methodInfo = typeof(MyClass)
.GetMethod(
"MyGenericStaticMethod"),
BindingFlags.NonPublic | BindingFlags.Static);
// T is known at compile time.
MethodInfo genericMethodInfo = methodInfo.MakeGenericMethod(new[] { typeof(T), keyType});
var expression = genericMethodInfo.Invoke(null, new object[] { params });
myQueryable.OrderBy(expression);
问题是,genericMethodInfo.Invoke() 返回object,因此不能与需要Func<T, TKey> 类型参数的OrderBy() 一起使用。但是,TKey 可以是不同的值类型,例如 string、int,它们仅在运行时才知道。这甚至可以做到吗?如果可以,怎么做?
【问题讨论】:
-
你想达到什么目的?您可以省略这样的通用参数:
someList.OrderBy(x => x.MyProperty). -
我正在尝试传递
Expression<Func<T, TKey>>而不是硬编码的 lambda 表达式。 -
您能否添加一个示例代码,说明您希望如何使用它?
-
我的项目nuget.org/packages/OrderByString 根据要排序的属性的字符串值在幕后创建您引用的 lambda 表达式。
标签: c# generics reflection