c# - 如何在 C# 中为开源项目设置 "override"内部类

标签 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类。

最佳答案

库版本:

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

通过查看 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/

相关文章:

c# - 使用 .NET 通过 HTTP 下载文件的最佳方式是什么?

c# - 字符串中的C#OR语句。包含

c# - IEnumerable 的早期执行

c# - 重复调用方法

c# - 转换一个可以为 null 的对象

c# - 在特定条件下从两个数据表中构建一个

c# - Azure - 使用服务主体对 Key Vault 进行身份验证会返回未经授权的异常

c# - 具有不同批量大小的 TPL 数据流和 BatchJoinBlock

c# - 使用 P/Invoke 跨 C++/C# 边界管理非托管字符串

c# - C# 是如何受到 C++ 而非 Java 的启发的?