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(); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д