映射不同对象的通用方法

时间:2018-08-08 15:24:03

标签: c# .net generics

我想创建一个可以将对象转换为其他类型的通用方法。在这种情况下,我找不到任何解决方案。在C#中可以吗?

class A
{
    public string Name { get; set; }
}

class A1: A
{
    public string ConnectionString { get; set; }
}

class B
{
    public string DBName { get; set; }
    public string DBConnectionString { get; set; }
}

void Main()
{
    A obj = //data
    var res = APIToBackEndModel<A, B>(obj);

    //Do something
    A1 obj1 = //data
    var res1 = APIToBackEndModel<A1, B>(obj1);
}

private TResult APIToBackEndModel<T, TResult>(T objTo)
{
    (TResult)DBName = (T)objTo.Name;

    //OR

    var obj = new TResult
    {
        DBName = (T)objTo.Name
    }
}

This对我没有帮助。

1 个答案:

答案 0 :(得分:1)

您将无法完全完成 通用操作,因为您依赖某些属性来存在。但是您知道这些属性存在是不够的。您必须保证编译器存在。您可以使用Constraints on type parameters进行此操作。在它们的帮助下,您可以定义所使用的泛型类型将具有某些属性(例如,实现接口或从类继承)。

interface InterfaceIn {
    string p1 {get;set;}

    void m1();
}

interface InterfaceOut {
     string p2 {get;set;}
     void m2();
}

class ConcreteIn : InterfaceIn {

    public string p1 {get;set;}
    public void m1() {}
}

class ConcreteOut1 : InterfaceOut {
    public string p2 {get;set;}
    public void m2() {}
}


class ConcreteOut2 : InterfaceOut {
    public string p2 {get;set;}
    public void m2() {}

}

class Program
{
    static void Main(string[] args)
    {
        var a = new ConcreteIn{p1 = "some value"};
        var b = mapIt<ConcreteIn, ConcreteOut1>(a);
        var c = mapIt<ConcreteIn, ConcreteOut2>(a);
    }

    public static V mapIt<U, V>(U val) where U: InterfaceIn where V: InterfaceOut, new() {
        var res = new V {p2 = val.p1};
        return res;
    }
}

根据您拥有的属性和组合的数量,这可能就足够了。或者,像Hans Ke st ing建议的那样使用Automapper之类的东西可能会更好。或者,如果您无法将某些映射组合在一起,则必须自己实现每个映射。