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