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

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

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

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

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

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
 
namespace _1024556
{
    public interface IMapping<T>
    {
        void Mapping(T value);
    }
 
    public class MyInt:IMapping<MyDouble>
    {
        public MyInt()
        {
        }
 
        public MyInt(int value)
        {
            Value = value;
        }
 
        void IMapping<MyDouble>.Mapping(MyDouble value)
        {
            Value = Convert.ToInt32(value.Value);
        }
 
        public int Value { get; set; }
    }
 
    public class MyDouble : IMapping<MyInt>
    {
        public MyDouble()
        {
        }
 
        public MyDouble(double value)
        {
            Value = value;
        }
 
        void IMapping<MyInt>.Mapping(MyInt value)
        {
            Value = Convert.ToDouble(value.Value);
        }
 
        public double Value { get; set; }
    }
 
    class Program
    {
        public static IEnumerable<TOut> Cast<TIn, TOut>(IEnumerable<TIn> data) where TOut: IMapping<TIn>, new()
        {
            return data.Select(element =>
                {
                    var result = new TOut();
                    ((IMapping<TIn>) result).Mapping(element);
                    return result;
                });
        }
 
        static void Main(string[] args)
        {
            IEnumerable<MyDouble> data = new[] { new MyDouble(0.0), new MyDouble(1.1), new MyDouble(2.2), new MyDouble(3.3), new MyDouble(4.4) };
            var result = Cast<MyDouble, MyInt>(data);
            data.ToList().ForEach(element=>Console.Write("{0} ", element.Value));
            Console.WriteLine();
            result.ToList().ForEach(element=>Console.Write("{0} ", element.Value));
            Console.ReadLine();
        }
    }
}

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


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

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

11   голосов , оценка 3.909 из 5
Похожие ответы