Generic методы. Как в этом методе обратиться к row как объекту типа DataRow или DataRowView - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток! Помогите пожалуйста разобраться с дженериками, что-то не догоняю я как они работают. Давайте рассмотрим конкретный пример. Есть у меня метод принимающий 2 параметра, первый int, а вот вторым может быть DataRow или DataRowView. Самому методу, на уровне логики и синтаксиса обращения ко второму параметру, всё равно что это будет. А метод большой и сложный, поэтому перегрузку делать бы не хотелось, поддерживать 2 абсолютно одинаковых метода совсем не комильфо. Вот я и пишу:
Листинг программы
  1. void MyFunc<T>(int i, T row)
  2. {
  3. //реализация метода
  4. }
Но как мне теперь в этом методе обратиться к row как объекту типа DataRow или DataRowView? Я его даже привести не могу к ним, пишет что не может привести объект типа T к типу DataRow/DataRowView, да и не знаю я к какому из этих двух типов его приводить, могу конечно доп. параметром передавать что это, но как это поможет, приведение то всё равно не получается сделать? В обще, подскажите пожалуйста, как с этим чудом работать то? P.S. Данную конкретную задачу решил так: у объекта типа DataRowView есть свойство типа DataRow, в общем свёл к тому, что всегда в метод передаю только DataRow, но интересует не решение задачи, а принципы работы с дженериками. Спасибо за внимание!

Решение задачи: «Generic методы. Как в этом методе обратиться к row как объекту типа DataRow или DataRowView»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Linq;
  5. using System.Text;
  6.  
  7. namespace _1024556
  8. {
  9.     public interface IMapping<T>
  10.     {
  11.         void Mapping(T value);
  12.     }
  13.  
  14.     public class MyInt:IMapping<MyDouble>
  15.     {
  16.         public MyInt()
  17.         {
  18.         }
  19.  
  20.         public MyInt(int value)
  21.         {
  22.             Value = value;
  23.         }
  24.  
  25.         void IMapping<MyDouble>.Mapping(MyDouble value)
  26.         {
  27.             Value = Convert.ToInt32(value.Value);
  28.         }
  29.  
  30.         public int Value { get; set; }
  31.     }
  32.  
  33.     public class MyDouble : IMapping<MyInt>
  34.     {
  35.         public MyDouble()
  36.         {
  37.         }
  38.  
  39.         public MyDouble(double value)
  40.         {
  41.             Value = value;
  42.         }
  43.  
  44.         void IMapping<MyInt>.Mapping(MyInt value)
  45.         {
  46.             Value = Convert.ToDouble(value.Value);
  47.         }
  48.  
  49.         public double Value { get; set; }
  50.     }
  51.  
  52.     class Program
  53.     {
  54.         public static IEnumerable<TOut> Cast<TIn, TOut>(IEnumerable<TIn> data) where TOut: IMapping<TIn>, new()
  55.         {
  56.             return data.Select(element =>
  57.                 {
  58.                     var result = new TOut();
  59.                     ((IMapping<TIn>) result).Mapping(element);
  60.                     return result;
  61.                 });
  62.         }
  63.  
  64.         static void Main(string[] args)
  65.         {
  66.             IEnumerable<MyDouble> data = new[] { new MyDouble(0.0), new MyDouble(1.1), new MyDouble(2.2), new MyDouble(3.3), new MyDouble(4.4) };
  67.             var result = Cast<MyDouble, MyInt>(data);
  68.             data.ToList().ForEach(element=>Console.Write("{0} ", element.Value));
  69.             Console.WriteLine();
  70.             result.ToList().ForEach(element=>Console.Write("{0} ", element.Value));
  71.             Console.ReadLine();
  72.         }
  73.     }
  74. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.909 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы