在不同的库之间强制转换对象
本文关键字:转换 对象 之间 | 更新日期: 2023-09-27 18:08:50
我有一个dll,我在其中定义了一个特定的对象(假设是Point3),以及不同的方法。
我有另一个dll,我使用相同类型的对象,但因为我想保持独立性,我声明了一个新的对象Point3_。这只是元素(x,y,z)的容器。
最后,我有一个项目,我使用两个库,我想知道是否有一个干净的方法从Point3转换到Point3_,假设他们有兼容的类型。
现在,我正在写这样的东西:
p_ = new Point3_(p.X, p.Y, p.Z);
我想要这样的:
p_ = (Point3_)p;
PS:我很抱歉,如果这是一个重复,但我不确定如何在网上搜索这个。
Thanks in advance
EDIT:我不介意实现类型转换代码,但我想在第三个项目中编写它,这两个库都知道。这样,我将能够单独开发库。
不完全是。唯一的选择是实现您自己的强制转换操作符,但这将意味着您试图避免的那种耦合。
然而,你可以编写扩展方法来为你处理这个问题——这些方法可以在一些互操作库中声明,或者在你自己的消费者项目中声明。
public static Point3_ AsPoint3_(this Point3 @this)
{
return new Point3_(@this.X, @this.Y, @this.Z);
}
简称为
p_ = p.AsPoint3_();
您可以通过实现显式操作符
来实现这一点public class Point3_
{
// Converts a Point3 to Point3_ by explicit casting
public static explicit operator Point3_(Point3 p)
{
return new Point3_(p.X, p.Y, p.Z);
}
}
如果您将explicit
更改为implicit
,则p_ = p;
也可以工作。
您还可以使用Automapper之类的工具自动执行映射。它是基于相同的属性名的映射。
Mapper.CreateMap<Point3, _Point3>();
_Point3 point = Mapper.Map<_Point3>(new Point3())
如果要在第一个库中声明一个接口:
public interface IPoint3 {
public int X;
... etc ...
}
然后让你的两个类实现这个接口(假设一个库引用另一个库,或者可能在一个单独的库中声明这个接口),然后你可以通过接口在调用代码中引用它们,例如:
List<IPoint3> results = new List<IPoint3>();
results.Add(new Point3());
results.Add(new _Point3();
int output = results.Sum(p => p.X);