使用Func <t,th =“”>委托的通用排序方法

时间:2018-03-05 18:28:11

标签: c# generics delegates

我尝试做的是创建一个接受类型swagger: "2.0" info: description: "A simple Google Cloud Endpoints API example." title: "Endpoints Example" version: "1.0.0" host: "echo-api.endpoints.projectid.cloud.goog" x-google-endpoints: - name: "echo-api.endpoints.projectid.cloud.goog" target: "SOME IP" # [END swagger] basePath: "/" consumes: - "application/json" produces: - "application/json" schemes: - "http" paths: "/list": get: description: "list" operationId: "Project.get" produces: - "application/json" responses: 200: description: "lists" schema: $ref: "#/definitions/Project" parameters: - description: "Project Name" in: body name: project_id required: true schema: $ref: "#/definitions/Res" security: - google_jwt_client-1: [] definitions: Res: properties: apierrmsg: type: "string" apiresults: type: "Array" definitions: Project: properties: project_id: type: "string" securityDefinitions: google_jwt_client-1: authorizationUrl: "" flow: "implicit" type: "oauth2" x-google-issuer: "some@projectid.iam.gserviceaccount.com" x-google-jwks_uri: "https://www.googleapis.com/robot/v1/metadata/x509/some@projectid.iam.gserviceaccount.com" 列表的通用方法以及一些搜索选项(即排序方向和排序字段),然后根据给定列表进行排序关于搜索选项。

我认为问题可能与我传递给OrderBy方法的Func委托的通用返回类型有关,但我并不完全确定是诚实的。此刻相当难倒。这就是我到目前为止所拥有的:

T

没有抛出异常,但没有发生排序。原始列表按照传递的顺序返回。非常感谢任何帮助。

修改

我很抱歉这里明显缺乏实际问题。老实说,我在发帖时没有意识到这一点。

感谢您对null运算符的建议。这给了我一个印象,即代码应该正常工作,当它真的应该抛出异常时。这使得调试非常令人沮丧,因为在执行代码时似乎没有任何问题。

正如StriplingWarrior在回答中提到的那样,我在lambda表达式中使用public static class TableGenerationHelper { public static IList<T> CreateReportObject<T>(IList<T> items, ISearchOptions searchOptions) where T : new() { Type sortFieldType = typeof(T).GetProperty(searchOptions.SortField)?.GetType(); MethodInfo createMethod = typeof(TableGenerationHelper).GetMethod("CreateSortedList"); MethodInfo methodRef = createMethod?.MakeGenericMethod(typeof(T), sortFieldType); Object[] args = { items, searchOptions.SortField, searchOptions.SortDirection }; results = (IList<T>)methodRef?.Invoke(null, args); return results; } public static IList<T> CreateSortedList<T, TH>(IList<T> items, String sortField, String sortDirection) where T : new() { Type type = typeof(T); PropertyInfo propInfo = type.GetProperty(sortField); Func<T, TH> orderByFunc = x => (TH)propInfo?.PropertyType.GetRuntimeProperty(sortField)?.GetValue(x, null); return LoadListOrderedByDirection(items, orderByFunc, sortDirection); } public static IList<T> LoadListOrderedByDirection<T, TH>(IList<T> items, Func<T, TH> keySelector, String sortDirection) { switch (sortDirection) { case "ASC": return items.OrderBy(keySelector).ToList(); case "DESC": return items.OrderByDescending(keySelector).ToList(); default: return items; } } } 而不是RuntimePropertyInfo

下次发布时,我一定会有一个实际的问题。

1 个答案:

答案 0 :(得分:0)

你正在吃一堆空值,这会让你错过一些你可能会看到异常的错误,而且Eric Lippert是正确的,你真的需要学会逐步调试代码来调试它。

你这里有几个错误。

  1. 您在@BeforeClass public static void setup() { System.setProperty("spring.kafka.bootstrap-servers", kafkaEmbedded.getBrokersAsString()); } 上使用PropertyType,它为您提供属性返回的类型,而不是声明属性的对象类型。然后你要求输入具有给定名称的属性的(这对我来说没有多大意义,因为你已经拥有了首先调用GetProperty的PropertyInfo。)
  2. 您在propInfo的结果上使用GetType(),它将始终返回运行时属性信息类的类型,而不是属性的实际类型。您想改用GetProperty
  3. 这似乎工作正常:

    PropertyType