C # Общий вопрос

2

У меня есть эта функция

public DataSet Fetch(string EntityName, ObjectParameter[] parameters, int pagesize, int pageindex)
    {
        Assembly asm = Assembly.Load("NCR.WO.PLU.ItemEDM");
        Type _type = asm.GetTypes().Where(t => t.Name.Equals(EntityName)).ToList().FirstOrDefault();

        object obj = Activator.CreateInstance(_type);

        return DataPortalFetch<???>(parameters, pagesize, pageindex);
    }

как передать этот _type в общую часть?

Теги:
generics

1 ответ

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

Вы должны вызвать метод, используя отражение. Дженерики предназначены для типов, которые известны во время компиляции; вы не знаете тип во время компиляции, поэтому вам нужно перепрыгнуть через несколько обручей. Это будет что-то вроде:

MethodInfo method = typeof(WhateverClass).GetMethod("DataPortalFetch");
MethodInfo constructed = method.MakeGenericMethod(new Type[] { _type });
return constructed.Invoke(this, new object[] {parameters, pagesize, pageindex});

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

  • Получить определение общего метода
  • Построить метод с правильным типом (эффективно: передать аргумент типа)
  • Вызвать этот построенный метод

Вы можете захотеть кэшировать определение общего метода в статическом поле readonly, btw - it reusable.

  • 0
    Я думаю, что если вы не хотите использовать отражение, вы можете использовать параметры Action или Func <> (в .NET 3.5 и Predicate в .NET 2.0)
  • 0
    @ Туомас: Как бы они помогли, если вам все еще нужно предоставить аргументы типа во время выполнения?

Ещё вопросы

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