Передайте тип переменной ViewModel как общий для метода

1

У меня есть метод, который работает с общим:

public static IRestResponse<T> Get<T>(long id, string apiEndPoint) where T : new()
{
        return Execute<T>(Method.GET, null, string.Concat(apiEndPoint, "/", id));
}

Я использую этот метод, передавая модель представления как общий для получения разобранного результата:

var result = RestHelper.Get<AnyViewModel>(1, "Country"));

Но я пришел к тому, что у меня есть переменная сущность, откуда я получаю модель вида:

var entity = "Country"; // This comes as a parameter
var viewModels = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(x => x.FullName.Contains("Core.ViewModel"));

if (viewModels != null)
{
    Type viewModel = viewModels.GetTypes().FirstOrDefault(x => x.Name.Contains(entity));

    if (viewModel != null)
    {
        var result = RestHelper.Get<???>(1, entity);
    }
}

Поэтому я могу получить тип модели представления с отражением, но я не знаю, что передать в <???> общий элемент функции.

ОБНОВИТЬ

Я не знаю, насколько это влияет на отражение, но у меня больше перегрузок метода Get:

public static IRestResponse Get(string apiEndPoint)
public static IRestResponse<T> Get<T>(string apiEndPoint) where T : new()
public static IRestResponse Get(long id, string apiEndPoint)
public static IRestResponse<T> Get<T>(long id, string apiEndPoint) where T : new()
Теги:
generics
reflection
asp.net-mvc

1 ответ

2
Лучший ответ

Вы должны будете использовать отражение, чтобы вызвать метод Get<T> с общим параметром, используя MakeGenericMethod.

Изменить. Поскольку существует несколько перегрузок, вместо этого используйте GetMethods и GetMethods их до тех, которые вы ищете. (Я не вижу перегрузки GetMethod который позволяет указать аргументы типа.)

MethodInfo method = typeof(RestHelper).GetMethods(BindingFlags.Static | BindingFlags.Public)
    .Where(method => method.Name == "Get" 
        && m.GetGenericArguments().Length == 1
        && m.GetParameters().Length == 2
        // just to be certain, in case someone adds more overloads in the future ...
        && m.GetParameters()[0].ParameterType == typeof(int)
        && m.GetParameters()[1].ParameterType == typeof(string))
    .FirstOrDefault();
if (method == null)
    throw new InvalidOperationException("Couldn't find an overload of RestHelper.Get<T> with int, string parameters");
MethodInfo genericMethod = method.MakeGenericMethod(viewModel);
genericMethod.Invoke(null, new object[] { 1, entity });

редактировать

Чтобы использовать " List<viewModel> ", вы можете использовать Type.MakeGenericType для получения List<T>:

var genericType = typeof(List<>).MakeGenericType(viewModel);
var genericMethod = method.MakeGenericMethod(genericType);
  • 0
    method возвращен как null . Может быть, потому что у меня больше перегрузок метода Get ? Включая неуниверсальную перегрузку?
  • 0
    Добавление BindingFlags.Public вызвало исключение Ambiguos в первой строке. Пожалуйста, смотрите мое редактирование.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню