Переход от наследства к ValueInjecter - PullRequest
1 голос
/ 28 октября 2011

У нас был собственный метод расширения объекта, который обрабатывал бы следующее.

  • Источник: DataRow Цель: class.
  • Источник - DataTable Цель - List<class>
  • Источник: class Цель: class
  • Источник: List<class> Цель: List<class>

Я нашел ValueInjecter и DataTable , поэтому я могу обрабатывать DataRow и DataTable.
Так что я на шаге, где склеиваю все это.

Вот что я попробовал.

public static class ObjectExtensions
{
    public static void OldFill(this object fillMe, object sourceObject)
    {
        Type sourceType = sourceObject.GetType();
        Type fillType = fillMe.GetType();

        switch (sourceType.Name)
        {
            case "DataRow":
                fillMe.InjectFrom<DataRowInjection>(sourceObject);
                break;

            case "DataTable":
                fillMe.InjectFrom<DataTableInjection<fillType>>(sourceObject);
                break;

            default:
                fillMe.InjectFrom(sourceObject);
                break;
        }
    }
}

Не уверен, как получить правильное fillType, чтобы заставить код работать правильно.
Поскольку это устаревший код, я не хочу менять подпись расширения.

1 Ответ

1 голос
/ 23 ноября 2011

Я не знаю ответа, но могу сказать, DataTableInjection<fillType> не скомпилируется. Вам нужно использовать Reflection для связывания, примерно так:

case "DataTable":
  var tableInjector = typeof (DataTableInjection<>).MakeGenericType(fillType);
  tableInjector.GetMethod("InjectFrom").MakeGenericMethod(tableInjector)
    .Invoke(fillMe, new[] { sourceObject });
  break;
...