我有一个dll,我定义了一个特定的对象(比方说,Point3),以及不同的方法。
我有另一个dll,我使用相同类型的对象,但由于我想保持独立性,我声明了一个新对象Point3_。这只是元素(x,y,z)的容器。
最后我有一个项目,我正在使用这两个库,我想知道是否有一种干净的方法从Point3转换为Point3_,假设它们具有兼容的类型。
现在,我写的是:
p_ = new Point3_(p.X, p.Y, p.Z);
我想要像:
p_ = (Point3_)p;
PS:如果这是重复,我很抱歉,但我不确定如何在网上搜索。
提前致谢
编辑:我不介意实现强制转换代码,但我想在第3个项目中编写它,它知道这两个库。这样我就可以单独开发库了。
答案 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);