将结构更改为实现 IXmlSerializable、IFormattable 和 IEquatable 的第三方库中的类<T>

问题描述 投票:0回答:0

我需要做很多 2D 几何工作,并且找到了一个绝对适合我需要的库。特定的库是

MathNet.Spatial
,它提供了我需要的确切功能,它与数字库
MathNet.Numerics
完美集成,这使它成为更好的选择。

不过我有一个问题,我需要能够在

MathNet.Spatial
库中子类化一种类型,这是不可能的,因为每种类型都是作为结构实现的。这是一个可以派生的要求,我对此事没有任何意见。我需要子类化的类型是
MathNet.Spatial.Euclidean.Point2D
,正如您可以想象的那样,所有其他类型都依赖于它。是圆类型的圆心,lineSegment类型的终点等

我对C#完全陌生,我需要用C#实现这个项目,所以有很多我不完全理解。其余更大的项目以 .NET 7 为目标,该库以相当旧的版本为目标,因此我还需要进行必要的更改以使其以 .NET 7 为目标,并为接口提供最新的所有方法签名等在。本质上,我必须将其修改为可以在 Linux、Windows、MacOS、iOS 和 Android 上运行的 C# 库。

现在我的计划是将“Point2D”从结构更改为类。我已经阅读了库的其余部分的源代码,这些源代码应该不会出现我能看到的任何问题,但正如我所说,我是 C# 的新手。有什么我不知道的新东西会在我脸上爆炸吗?我知道可为 null 的引用类型将是我必须敏锐地意识到的事情。

我知道的一个问题是序列化,例如“Point2D”有以下内容:

    public static Point2D ReadFrom(XmlReader reader)
    {
        return reader.ReadElementAs<Point2D>();
    }

适用于值类型但不适用于引用类型。我对 XmlSerialization 的了解还不够,无法正确实现“IXmlSerializable”。

由于

Point2D
目前是一个结构,以下
IXmlSerializable
工作的方法,但在更改为类时不会。

 void IXmlSerializable.ReadXml(XmlReader reader)
    {
        if (reader.TryReadAttributeAsDouble("X", out var x) &&
            reader.TryReadAttributeAsDouble("Y", out var y))
        {
            reader.Skip();
            this = new Point2D(x, y);
            return;
        }

        if (reader.TryReadChildElementsAsDoubles("X", "Y", out x, out y))
        {
            reader.Skip();
            this = new Point2D(x, y);
            return;
        }

        throw new XmlException("Could not read a Point2D");
    }

Point2D
总共只有两个字段,一个X和Y坐标,每个都是一个
double
。是不是修改几行就这么简单:

        void IXmlSerializable.ReadXml(XmlReader reader)
    {
        if (reader.TryReadAttributeAsDouble("X", out var x) &&
            reader.TryReadAttributeAsDouble("Y", out var y))
        {
            reader.Skip();
            //this = new Point2D(x, y);
            X = x;
            Y = y;
            return;
        }

        if (reader.TryReadChildElementsAsDoubles("X", "Y", out x, out y))
        {
            reader.Skip();
            //this = new Point2D(x, y);
            X = x;
            Y = y;
            return;
        }

        throw new XmlException("Could not read a Point2D");
    }

任何和所有输入将不胜感激。

.net porting nullable-reference-types mathnet-numerics ixmlserializable
© www.soinside.com 2019 - 2024. All rights reserved.