我正在尝试修改从开源库中获取的类。虽然我在项目中引用了库,但原始类包含对标记为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
类。
答案 0 :(得分:3)
图书馆版本:
您确定使用的是最新版本的库吗?
通过查看Vector.Range的来源,我可以看到它是public
成员。
Nuget packages of Accord.NET似乎是最新的,请查看您当前的版本。
此外,我建议您依赖NuGet包而不是手动安装的程序集(您可以在Nuget Package Manager中看到更新通知作为奖励)。
扩展库:
这里有几个选项,
(我个人先尝试第1步)
<强>调试:强>
引用Nuget包时,可以使用Telerik JustDecompile(免费软件)创建PDB输出程序集引用。这样做可以减轻您拖动自己的构建等问题。