在不同的库之间转换对象

时间:2015-08-20 11:08:35

标签: c# casting

我有一个dll,我定义了一个特定的对象(比方说,Point3),以及不同的方法。

我有另一个dll,我使用相同类型的对象,但由于我想保持独立性,我声明了一个新对象Point3_。这只是元素(x,y,z)的容器。

最后我有一个项目,我正在使用这两个库,我想知道是否有一种干净的方法从Point3转换为Point3_,假设它们具有兼容的类型。

现在,我写的是:

p_ = new Point3_(p.X, p.Y, p.Z);

我想要像:

p_ = (Point3_)p;

PS:如果这是重复,我很抱歉,但我不确定如何在网上搜索。

提前致谢

编辑:我不介意实现强制转换代码,但我想在第3个项目中编写它,它知道这两个库。这样我就可以单独开发库了。

4 个答案:

答案 0 :(得分:4)

不是真的。唯一的选择是实现你自己的转换操作符,但这意味着你正试图避免的那种耦合。

但是,您可以编写扩展方法来为您处理 - 可以在某些互操作库或您自己的使用者项目中声明这些方法。

qplot

简称为

public static Point3_ AsPoint3_(this Point3 @this)
{
  return new Point3_(@this.X, @this.Y, @this.Z);
}

答案 1 :(得分:2)

您可以通过实现显式运算符

来实现此目的
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;也会有效。

答案 2 :(得分:1)

您还可以使用Automapper之类的内容自动执行映射。它是基于相同属性名称的映射。

Mapper.CreateMap<Point3, _Point3>();
_Point3 point = Mapper.Map<_Point3>(new Point3())

答案 3 :(得分:0)

如果您要在第一个库中声明一个接口:

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);