如何在c#中定义自定义通用转换器

时间:2011-06-29 13:04:54

标签: c# generics type-conversion

我想为自己创建一个转换器类,我想声明一个函数将一种类型的对象转换为另一种类型。

例如,如果有两个类 -

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 个答案:

答案 0 :(得分:3)

您应该查看AutoMapper

答案 1 :(得分:0)

我赞成devdigital的AutoMapper建议,但也想建议考虑重构你的类来继承基类,如果可能的话。因此,您的转换/转换将非常简单。

答案 2 :(得分:0)

我对AutoMapper解决方案也提出了一个更好的选择,一个可行的替代方案是ValueInjecter,可能更简单一些。

答案 3 :(得分:0)

您无法创建简单的通用转换器。

单向 - 使用反射。您可以自动转换对象。但事情并非如此简单。你必须写一些代码。

另一种方式 - 你可以使用非常简单的转换器。但是你必须为每个案例描述转换规则。通常不需要为转换编写大量代码。以下是您案例的示例

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