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();
}
}
}