如何在C#中“覆盖”开源项目的内部类

时间:2017-01-21 19:15:54

标签: c#

我正在尝试修改从开源库中获取的类。虽然我在项目中引用了库,但原始类包含对标记为internal的库部分的引用。这导致我的代码中出现构建错误。

我读到了这个答案:How do you "override" an Internal Class in C#?。请注意,当一个人无法访问源代码时,它表示想要访问internal类时运气不好。然而,对我来说情况并非如此。

我可以解决这个问题,但我想知道是否有一个很好的方法来做到这一点。在我看来,我有两个选择。我可以修改internal类的源代码,使其不是internal(坏),或者我可以将类本身直接导入到我的项目中(更糟)。如果我导入该类,还有其他参考问题,我可能必须导入整个库来修复依赖项。

请注意,我知道我可以将我的更改添加到开源库,然后将其构建为我的代码中引用的新库。我现在不想这样做,因为我希望能够在调试器中进入我的方法。一旦我调试了我的方法并保证其实用性,我将把它作为我的开源项目版本的一部分。

我是c#的新手,这是我第一次参与大型开源项目,所以我想就如何处理这个问题提出一些建议。

更新

以下是我要修改的图书馆源代码的链接:https://github.com/accord-net/framework/blob/development/Sources/Accord.Math/Optimization/Unconstrained/Least%20Squares/LevenbergMarquardt.cs

要修改此代码,我在visual studio中打开了源代码,并尝试构建当前存在的版本。在第304行,出现以下代码:
int[] block = Vector.Range(s * blockSize, s * blockSize + B);

当我在visual studio中有这个文件时,它会给我一个错误,说Vector由于其保护级别而无法访问。当我在智能感知窗口中查看该代码的定义时,它会显示Vector被标记为internal

如果我尝试将Vector的源代码添加到我的项目中,则会发布更多相同类型的源代码,因为Vector使用其他internal类。

1 个答案:

答案 0 :(得分:3)

图书馆版本:

您确定使用的是最新版本的库吗?

通过查看Vector.Range的来源,我可以看到它是public成员。

Nuget packages of Accord.NET似乎是最新的,请查看您当前的版本。

此外,我建议您依赖NuGet包而不是手动安装的程序集(您可以在Nuget Package Manager中看到更新通知作为奖励)。

扩展库:

这里有几个选项,

  • discuss with the authors关于打开一些内部类型的可能性,解释您的需求,他们甚至可能建议一条替代路径,而不会在他们身边进行此类更改
  • 分叉库并进行更改,最终PR

(我个人先尝试第1步)

<强>调试:

引用Nuget包时,可以使用Telerik JustDecompile(免费软件)创建PDB输出程序集引用。这样做可以减轻您拖动自己的构建等问题。