Передача неизвестного типа в качестве параметра методу, а затем приведение к этому типу позже

#c# #linq #generics #dynamic

#c# #linq #общие положения #динамический

Вопрос:

Мне нужно создать метод, который принимает неизвестный тип, а затем позже использует этот тип для доступа к объекту.

Немного подробнее. У меня есть DevEx grid, и я использую GetRow для получения записи. GetRow должен иметь тип объекта класса Linq для доступа к свойствам записи. Я пытаюсь создать универсальный метод, который позволит мне передавать тип объекта Linq, а затем динамически приводить результат из GetRow к этому объекту. Затем я получу столбец fieldname для доступа к свойствам следующим образом (ObjectType — это неизвестный тип):

 void DoGrid (GridView gv, objectType)
{    

    PropertyInfo[] properties = objectType.GetProperties();

    foreach (GridColumn col in gv.Columns)
        {
             if (col.Visible)
             {
                 PropertyInfo property = properties.Where(prop => prop.Name == col.FieldName).FirstOrDefault();
                 ...
             }
        }

}
  

Комментарии:

1. Я просто хочу передать тип. Я не думаю, что var будет работать в приведенном выше примере.

Ответ №1:

Вы просто ищете способ сделать это с помощью дженериков? Возможно, что-то вроде:

 void DoGrid<T>(GridView gv)
{
    PropertyInfo[] properties = typeof(T).GetProperties();

    foreach (GridColumn col in gv.Columns)
    {
        ...
    }
}
  

и тогда вы бы использовали это как:

 DoGrid<MyClassFullOfProperties>(myGridView);
  

Комментарии:

1. на 40 секунд быстрее, чем у меня.

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

3. Теперь я получаю сообщение об ошибке «System. Отражение. PropertyInfo[] не содержит определения для Where

4. вероятно, вам нужен using System.Linq; в верхней части вашего файла кода. .Where(...) это метод расширения.

5. Мой плохой … перемещал материал. Спасибо