在不同的库之间强制转换对象

本文关键字:转换 对象 之间 | 更新日期: 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);