Передача возвращаемого значения из вызванного метода в универсальный метод - PullRequest
0 голосов
/ 09 июля 2019

Я создаю модульный API, в котором люди могут вносить свой вклад с помощью своих конечных точек, помечая свои методы ресурсов своими пользовательскими атрибутами.Их методы становятся доступными, если я загружаю их dll в свое приложение.Когда запрашивается ресурс, моя программа выбирает сбор данных из созданного ими метода (в своих собственных классах) и применяет к ним сортировку и фильтрацию (возможно, с помощью DynamicLinq) перед отправкой сериализованного ответа в JSON.Все открытые поля (и, возможно, свойства) в этих классах считаются полями в API.

Как вы, возможно, понимаете, я знаю только типы этих классов данных во время выполнения, но я надеялся, что смогу вызвать методы конечной точки и передать возвращаемый IEnumerable<SomeUnknownType> моему методу фильтрации каким-либо образом.Я все еще немного новичок в дженериках и во внутренней работе C #.

Мои идеи варьировались от чистого размышления, сериализации до JSON в их конце, а затем парсинга строки на моем конце, и теперь дженерики.Нашел этот вопрос: Использование отражения для сериализации файлов , в которых было какое-то «взлом», но я не совсем понял и не смог заставить его работать.

Я получаю только DynamicLinq дляСортировать мои данные, когда коллекции с общим T.

О, и я застрял на .Net 3.5, поэтому нет динамики.

public static void Main(string[] args)
{
    //Retrieves MethodInfo from a 'MethodHub' class, collected via Reflection at runtime.
    MethodInfo endpointMethod = MethodHub.GetEndpointMethod();

    // Invokes EndpointMethod. I know it will return an IEnumerable<T>, where T is unknown.
    object requestedList = method.Invoke(null, null);

    // The list should be passed to the 'Filter'-method, but it needs to be cast to its actual type first, so...
    Filter(requestedList);
}

// This is the method I want to pass the return value 'list' from 'EndpointMethod'
public static void IEnumerable<T> Filter<T>(IEnumerable<T> inputList)
{
    // Filtering inputList with DynamicLinq
}

Это в каком-то неизвестном классе.

// This is the 'EndpointMethod'. The type of this IEnumerable<> is known only at runtime.
public static IEnumerable<SomeUnknownType> EndpointMethod()
{
    IEnumerable<SomeUnknownType> list = new List<SomeUnknownType>();

    return list;
}

1 Ответ

1 голос
/ 10 июля 2019

После вызова GetEndpointMethod вы можете получить тип T требуемого списка на requestedList.GetType().GetGenericArguments().First().Попробуйте этот код:

public static void Main(string[] args)
{
      MethodInfo endpointMethod = typeof(Main).GetMethod("EndpointMethod").MakeGenericMethod(typeof(int)); //Replace Main with your class name

      object requestedList = endpointMethod.Invoke(null, null);

      var result = typeof(Main).GetMethod("Filter").MakeGenericMethod(requestedList.GetType().GetGenericArguments().First()).Invoke(null, new object[]{ requestedList });  //Replace Main with your class name
}

public static IEnumerable<T> Filter<T>(IEnumerable<T> inputList)
{
  return inputList;
}

public static IEnumerable<T> EndpointMethod<T>()
{
  IEnumerable<T> list = new List<T>();

  return list;
}
...