【问题标题】:Inherit a class with same namespace and same class name继承具有相同命名空间和相同类名的类
【发布时间】:2015-07-18 23:22:05
【问题描述】:

我设法在 2 节课中完成,但我在 3 节课中失败了。 假设我有一个程序集 A.DLL,它有 namespace = "City" 和一个 class= "NY"

(我将在我的问题中将此类称为“A”)

在我的新项目中,我的命名空间是 = "City",我有一个 class= "NY"(我将在我的问题中将此类称为 "B")

所以要实现 B : A (B Inherit/Extend from A) 我为引用 A.DLL 创建了一个别名 并在“B”类中引用“extern alias oldDll”

namespace City
{
    extern alias oldDll;

    public class NY : oldDll::City.NY
    {
        public NY() : base()
        {
        }
    }
}

这很好用! :)

问题是当我尝试在另一个程序集中使用新的程序集(B.DLL /“B”类)时只引用 B.DLL(我将在我的问题中将这个类称为“C”)并创建“City.NY”的新实例 我得到一个异常,我认为这是因为“A.DLL”没有加载。

如何从 B 加载它(如果这是问题)?我无法访问“C.EXE”或 C 代码(他只是从 B.DLL 创建 City.NY)。 *注意:我不能重新编译C。我只能运行它。

所以我有一个类“C”,它创建一个继承自“A”的类“B”

我想过在“B”代码中手动加载“A.DLL”程序集,但首先发生的是 base() 构造函数.. :\

感谢您的帮助

【问题讨论】:

  • 好问题但是你提出它的方式使它比必要的更难理解。例如,1. 与其用文本描述命名空间和类,为什么不用代码描述呢? (例如:“在 A.dll 中:namespace City { class NY { … } }”)2. 为什么不将外部别名和类引用与其实际名称对齐?如果您有A.dll,为什么要命名外部别名oldDll?为什么不A?当你可以称它为A::City.NY 时,为什么将A.dllCity.NY 类称为“A”?这样,您问题的读者将不得不进行更少的心理杂耍。 ;)
  • @stakx 谢谢我下次会记住的:)

标签: c# class inheritance namespaces .net-assembly


【解决方案1】:

请纠正我,因为我不是 100% 确定,但通常您必须引用这两个程序集才能使其正常工作(这就是某些包具有依赖项的方式,也必须下载并在项目中引用)。

我认为如果不缺少程序集,它也不会编译。

【讨论】:

  • C.dll 可能是针对不需要 A.dll 的 B.dll 版本编译的,在这种情况下您不会收到编译器错误。
  • @Kamo 我无法重新编译“C”,我只是运行“C.EXE”
  • @Georg - 当然,但作者说So I have a class "C" which create a class "B" which inherits from "A" - 在这种情况下,我假设 B 引用 A。
  • @Jumpy_Goat - 好的,但你知道这个神秘的A.dll 是什么吗?为什么你不能重新编译你的C?如果你没有源,就很难改变任何修复它。
  • @Kamo 也许以前版本的 B 没有从 A 继承,在这种情况下,就不需要对 A.dll 的引用。
【解决方案2】:

发生的第一件事实际上不是基本构造函数,而是类型构造函数。您可以通过以下方式指定:

static B()
{
}

请注意,类型构造函数上不允许使用访问修饰符。但无论哪种方式,我猜在此之前就已经加载了基本类型,所以你在这里没有机会。

配置文件也无济于事。他们可以重定向现有的引用(参见https://msdn.microsoft.com/en-us/library/7wd6ex19%28v=vs.110%29.aspx),但我认为他们不能添加以前没有的引用。

【讨论】:

    【解决方案3】:

    你不能。

    简单地说 - 让 B.dll 中的类 City.NY 继承自 A.dll 中的 City.NY 是一个重大更改,需要重新编译依赖于 B.dll 的程序集。

    【讨论】:

    • 重新编译不会有帮助...您是否需要添加对其他 DLL 的引用并重新编译?
    • 在重新编译其他程序集时,它们需要引用 A.DLL,否则会导致编译器错误。
    • 我大约 90% 确信您可以通过动态加载和反射来完成它,但是代码会很笨拙。
    猜你喜欢
    • 2011-05-29
    • 2011-12-01
    • 1970-01-01
    • 2012-07-31
    • 2016-01-04
    • 2012-01-25
    • 2022-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多