Преобразовать в тип, объявленный в типе класса

#c# #reflection #casting

#c# #отражение #Кастинг

Вопрос:

ребята, у меня есть метод, в котором я передаю объект типа Type. И я хочу преобразовать объект, который у меня есть в этом методе, для ввода типа. Например

 void SetNewRecord(Type requiredType)
{
  var list = GridView.DataSource as requiredType;
  for (int i = 0; i < list.Length; i  )
  {
    if (list[i].KOD == kod)
    {
      GridView.CurrentCell = GridView[0, i];

      return;
    }
  }
}
 

если я передам int[] в качестве параметра, я хочу, чтобы GirdView.DataSource был преобразован в int[] . Возможно ли это в C #?

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

1. Ваш цикл написан так, как будто вы уже знаете , что это будет массив. Знаете ли вы это?

2. Я не понимаю, как вы можете запустить это с int[] помощью . Что list[i].KOD с этим делать?

3. Да, я знаю, что это будет массив. Что касается int[] — я использовал пример с int для простоты, на самом деле будет определяемый пользователем класс, который будет иметь свойство KOD .

Ответ №1:

Вы можете попробовать использовать Generic для решения вашей проблемы

 public interface ISample
{
    object KOD {get;set;} 
}

void SetNewRecord<T>() where T : ISample
{
     var list = GridView.DataSource as IEnumerable<T>;
     // implement needed logic here
}
 

И если вы хотите вызвать его через отражение

  MethodInfo castMethod = this.GetType().GetMethod("SetNewRecord").MakeGenericMethod(type);
 castMethod.Invoke(null, null);
 

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

1. OP спрашивает, может ли он выполнить приведение с помощью отражения. Я показал ему, как это сделать. Реализация логики в методе — его задача

2. Это хорошая идея использовать здесь универсальный метод, я думал об этом, но нам нужно проверить свойство класса T (я знаю, что у каждого класса T будет свойство KOD, которое мне нужно проверить). Используя generic, мы не можем этого сделать.

3. Вы можете создать интерфейс с помощью свойства KOD и наследовать свои классы из этого интерфейса. Затем вы можете указать, что хотите передавать только типы, производные от этого интерфейса. Смотрите мое редактирование