#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 и наследовать свои классы из этого интерфейса. Затем вы можете указать, что хотите передавать только типы, производные от этого интерфейса. Смотрите мое редактирование