Как определить пользовательский универсальный конвертер в C # - PullRequest
0 голосов
/ 29 июня 2011

Я хочу создать класс преобразователя для себя, где я хочу объявить функцию для преобразования объекта одного типа в другой тип.

Например, если есть два класса -

class A
{
     private int ID {get;set;}
     private string Name  {get;set;}
}

class B
{
     private int ID {get;set;}
     private string Name {get;set;}
     private string Address {get;set;}
}

Я объявил свой метод класса следующим образом -

  T2 Convert<T1, T2>(T1 t1_object)
    {
         A obj1 = (A)t1_object;
         T2 obj2; 

// ... some logic here where properties of t1_object are copied to obj2 (which will be of type B class)....

         return obj2;      
    }

Любая помощь будет отличной.

спасибо!

Ответы [ 4 ]

3 голосов
/ 29 июня 2011

Вы должны взглянуть на AutoMapper

0 голосов
/ 29 июня 2011

Вы не можете создать простой универсальный конвертер.

Один из способов - использовать отражение. Вы можете конвертировать объекты автоматически. Но это не так просто. Вам придется написать код.

Другой способ - вы можете использовать очень простой конвертер. Но вы должны описать правила конвертации для каждого случая. Обычно нет необходимости писать много кода для преобразования. Вот пример для вашего случая

public static class ConvertExtension //exstension for convertion
{
    //automatic convertion
    //later you define in lambda wich data needs to be converted
    public static T Convert<S, T>(this S source, Action<S, T> convert)
        where S : class
        where T : class
    {
        T target = System.Activator.CreateInstance<T>();
        convert(source, target);
        return target;
    }

    //convert data defined in interface
    //you need copy all fields manually
    public static T Convert<T>(this IData source)
        where T : IData
    {
        T target = System.Activator.CreateInstance<T>();

        target.ID = source.ID;
        target.Name = source.Name;

        return target;
    }
}

public interface IData //Describe common properties
{
    int ID {get; set;}
    string Name {get; set;}
}

class A : IData //Interface already implemented. You just mark classes with interface
{
    public int ID { get; set; }
    public string Name { get; set; }
}

class B : IData
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Address { get; set; }
}

//example
A a = new A();
B b1 = a.Convert<B>();
B b2 = a.Convert<A, B>((s, t) => t.ID = s.ID);
0 голосов
/ 29 июня 2011

Я тоже поддерживаю решение AutoMapper, и жизнеспособной альтернативой является ValueInjecter , возможно, немного проще.

0 голосов
/ 29 июня 2011

Я одобрил предложение AutoMapper devdigital, но также хотел предложить рассмотреть возможность рефакторинга ваших классов для наследования от базового класса, если это возможно.Таким образом, ваше преобразование / кастинг будет очень простым.

...