如何在c中定义自定义通用转换器
本文关键字:自定义 转换器 定义 | 更新日期: 2023-09-27 18:00:44
我想为自己创建一个转换器类,在这里我想声明一个函数,将一种类型的对象转换为另一种类型。
例如,如果有两个类-
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;
}
任何帮助都会很棒。
谢谢!
您应该了解一下AutoMapper
我支持devdigital的AutoMapper建议,但如果可能的话,我也想建议考虑重构类以从基类继承。因此,你的转换/铸造将非常简单。
我也对AutoMapper解决方案进行了改进,一个可行的替代方案是ValueInjecter,可能会简单一点。
您无法创建简单的通用转换器。
单向-使用反射。您可以自动转换对象。但事情并不是那么简单。你必须写一些代码。
另一种方式-您可以使用非常简单的转换器。但您必须描述每种情况下的转换规则。通常不需要编写大量的转换代码。以下是的例子
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);