【问题标题】:C# 6 namespace as string from a strongly typed namespace referenceC# 6 命名空间作为来自强类型命名空间引用的字符串
【发布时间】:2016-10-08 17:38:10
【问题描述】:

我想从强类型命名空间引用中获取命名空间字符串,其方式与 C# 6 nameof() 适用于类型和类型成员的方式类似。

namespace This.Is.My.Namespace
{
    class Program
    {
        static void Main()
        {
            string namespaceString = nameof(This.Is.My.Namespace);
            Console.Write(namespaceString);
        }
    }
}

但我得到的结果只是命名空间的最后一部分(例如“命名空间”)。我的目标是 .NET 4.6

这可能吗?

备注:我希望能够引用任何可用的命名空间,而不仅仅是包含的命名空间。

【问题讨论】:

  • 您链接到的页面的第一句话是“用于获取变量、类型或成员的简单(非限定)字符串名称”。但这听起来像是一个 X-Y 问题:当您可以从命名空间中的类型获取命名空间名称时,为什么需要这样做来获取命名空间名称?
  • @stuartd 例如,我想过滤来自程序集反射的某些类型
  • 你为什么不展示一个你实际尝试做的例子?
  • @stuartd 因为这是一个更普遍的问题。我正在寻找一种干净灵活的方式来表达命名空间,而不是硬编码的文字,以后很难重构。

标签: c# .net namespaces


【解决方案1】:

这应该可以...

var myType = this.GetType();
var namespaceString = myType.Namespace;

【讨论】:

  • typeof(this) 不会编译。也许是this.GetType()typeof(Program)
  • 您不知道该命名空间中的任何类型?据我所知,没有任何类型的 Namespace 在运行时将无法访问,因为它不包含任何内容。
  • @Marcus 如果您在同一个命名空间中包含多个类型,那么选择特定类型是很奇怪的。我真的很喜欢 nameof() 语法的清晰性。
  • 但是你认为命名空间到底是什么,因为我认为你误解了这个概念。命名空间只是一个容器。它真的什么都不是,在运行时没有对它的引用(不占用内存)。没有类型 - 命名空间在运行时上下文中不存在。如果您扩大问题范围并解释您想要实现的目标,也许我们可以提供更好的帮助?
  • 我想我的意思是,由于本身没有对命名空间的引用(在运行时),因此无法将命名空间名称作为字符串获取,因为您无法从中检索它。您将需要命名空间中的类型或类型的实例。
【解决方案2】:

对于字符串使用下面的代码

    Type myType = typeof(MyClass);
    var n = myType.Namespace;

Type myType = typeof(MyClass);
Console.WriteLine("Namespace: {0}.", myType.Namespace);

【讨论】:

    【解决方案3】:

    nameof 在编译时被string 替换,其中string 是该成员的精确文本(就像您将自己放入"" 中一样)。

    为了实现你想要的,你可以构建一些类似怪物的东西:

    namespace This.Is.My.Namespace
    ...
    var namespaceString = $"{nameof(This)}.{nameof(This.Is)}.{nameof(This.Is.My)}.{nameof(This.Is.My.Namespace)}";
    

    这将确保每个成员在编译时都存在,并允许轻松重构其中任何一个(好吧,除非您决定添加/删除某些名称)。

    P.S.:但显然其他答案在生成相同字符串时更有效

    【讨论】:

    • 聪明,但很难阅读和打字。不过,这离我的目标又近了一步。
    猜你喜欢
    • 2011-03-10
    • 2013-03-25
    • 2022-12-31
    • 2011-08-16
    • 2013-02-07
    • 2010-12-23
    • 1970-01-01
    相关资源
    最近更新 更多