我正在尝试修改从开源库中获取的类。虽然我在我的项目中引用了该库,但原始类包含对库中标记为 internal
的部分的引用。这会导致我的代码出现构建错误。
我读了这个答案:How do you "override" an Internal Class in C#? .请注意,这表明在无法访问源代码的情况下想要访问 internal
类时运气不好。然而,我的情况并非如此。
我可以解决这个问题,但我想知道是否有好的方法来解决这个问题。在我看来,我有两个选择。我可以修改 internal
类的源代码,使其不是 internal
(不好),或者我可以将类本身直接导入到我的项目中(更糟)。如果我导入类,还有进一步的引用问题,我可能不得不导入整个库来修复依赖关系。
请注意,我知道我可以将更改添加到开源库,然后将其构建为新库以在我的代码中引用。我现在不想这样做,因为我希望能够在调试器中进入我的方法。一旦我调试了我的方法并确保其实用性,我将把它作为我的开源项目版本的一部分提供。
我是 c# 的新手,这是我第一次从事大型开源项目,所以我想就如何处理这个问题寻求一些建议。
更新:
为了修改此代码,我在 visual studio 中打开源代码并尝试构建当前存在的版本。在第 304 行出现以下代码:
int[] block = Vector.Range(s * blockSize, s * blockSize + B);
。
当我在 visual studio 中有这个文件时,它给我一个错误,指出 Vector
由于其保护级别而无法访问。当我在智能感知窗口中查看该代码的定义时,它显示 Vector
被标记为 internal
。
如果我尝试将 Vector
的源代码引入我的项目中,则会出现更多相同类型的问题,因为 Vector
使用其他 internal
类。
最佳答案
库版本:
您确定您使用的是最新版本的库吗?
通过查看 Vector.Range 的来源我可以看到它是一个 public
成员。
Nuget packages of Accord.NET似乎是最新的,所以请检查您当前的版本。
此外,我建议您依赖 NuGet 包而不是手动安装的程序集(作为奖励,您会在 Nuget 包管理器中看到更新通知)。
扩展库:
这里有几个选项,
- discuss with the authors关于打开一些内部类型的可能性,解释您的需求,他们甚至可能会建议替代路径,而无需在他们这边进行此类更改
- fork 库并进行更改,最终 PR
(我个人会先尝试第 1 步)
调试:
引用 Nuget 包时,您可以使用 Telerik JustDecompile 创建程序集引用的 PDB (免费软件)。这样做可以减轻您拖拽自己的构建等的负担。
关于c# - 如何在 C# 中为开源项目设置 "override"内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41783423/