我想创建一个可以将对象转换为其他类型的通用方法。在这种情况下,我找不到任何解决方案。在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对我没有帮助。
答案 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之类的东西可能会更好。或者,如果您无法将某些映射组合在一起,则必须自己实现每个映射。