【问题标题】:How can I retrieve the namespace to a string C#如何将命名空间检索到字符串 C#
【发布时间】:2013-08-31 09:11:40
【问题描述】:

我正在编写一个需要程序名称空间的程序,但我似乎不知道如何检索它。我希望最终结果是一个字符串。

我能够找到有关此主题的 MSDN 页面,但事实证明它对我自己没有帮助。 http://msdn.microsoft.com/en-us/library/system.type.namespace.aspx

任何帮助将不胜感激。该程序是用 C# 编写的。

编辑:对不起,这不是控制台应用程序。

【问题讨论】:

  • 我不太清楚你的问题。你为什么不把你的程序的命名空间写在你想要的地方呢?有什么变化吗?
  • @IllidanS4:这是一个非常有效的问题。将命名空间硬编码在程序中的字符串中会导致灾难 - 迟早有人会更改命名空间而忘记或不知道它也在程序中进行了编码,然后它就会失败。
  • 用例:程序集中的嵌入资源的路径以命名空间为前缀。下面的答案提供了一种查找该前缀的强类型方法。

标签: c# string namespaces


【解决方案1】:

这应该可行:

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

写出到控制台:

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

设置 WinForm 标签:

Type myType = typeof(MyClass);
namespaceLabel.Text = myType.Namespace;

或者在相关类中创建一个方法并在任何地方使用:

public string GetThisNamespace()
{
   return GetType().Namespace;
}

【讨论】:

  • 不幸的是,它不是控制台应用程序,因此行中 {0} 的意义: Console.WriteLine(" Namespace: {0}.", myType.Namespace);我不知道。
  • 好的,这是什么类型的应用程序?
  • WriteLine 不是她必不可少的部分。使用string.Format() 并继续前进。
  • 这是一个 Windows 窗体应用程序。
  • @ElliotAmes myType.Namespace 在这种情况下是一个字符串
【解决方案2】:

您可以简单地使用typeof,然后传入类(即程序):

Console.WriteLine(typeof(Program).Namespace); 

哪个会打印:

ConsoleApplication1

【讨论】:

    【解决方案3】:

    把这个放到你的程序集中:

    public static string GetCurrentNamespace()
    {
        return System.Reflection.Assembly.GetExecutingAssembly().EntryPoint.DeclaringType.Namespace;
    }
    

    或者如果你希望这个方法在你的程序使用的库中,可以这样写:

    [System.Runtime.CompilerServices.MethodImpl(MethodImplOptions.NoInlining)]
    public static string GetCurrentNamespace()
    {
        return System.Reflection.Assembly.GetCallingAssembly().EntryPoint.DeclaringType.Namespace;
    }
    

    【讨论】:

    • 这比 typeof() 和 nameof() 答案要好,因为使用 GetCurrentNamespace() 的方法可以移动到不同的类或完全不同的命名空间,而无需更改代码。
    【解决方案4】:

    如果您在命名空间B 中有A 类的项目x,则可以使用:

    string s = x.GetType().Namespace;
    

    没有s 包含“B”

    您也可以使用x.GetType().Name 获取类型名称或使用x.GetType().FullName 获取两者

    【讨论】:

      【解决方案5】:
      Type myType = typeof(MyClass);
      // Get the namespace of the myClass class.
      Console.WriteLine("Namespace: {0}.", myType.Namespace);
      

      以 Joe 的评论为基础,您仍然可以使用

      Type myType = typeof(MyClass);
      // Get the namespace of the myClass class.
      var namespaceName = myType.Namespace.ToString();
      

      namespaceName 是一个变量,可以将命名空间名称作为字符串值访问。

      【讨论】:

        【解决方案6】:

        这不会出错:

        MethodBase.GetCurrentMethod().DeclaringType.Namespace
        

        【讨论】:

        • 这比接受的答案和此处发布的其他变体有什么好处?
        • 这一行可以在应用程序的任何方法中逐字使用。接受的答案是围绕获取 typeof(MyClass) 编写的。因此,对于真正复制/粘贴友好的代码,这会获胜(尽管在运行时可能会慢一些)。
        【解决方案7】:

        添加到所有答案。

        从 C# 6.0 开始就有了 nameof 关键字。

        string name = nameof(MyNamespace);
        

        这有几个优点:

        1. 名称在编译时解析
        2. 重构命名空间时名称会改变
        3. 已检查语法,因此名称必须存在
        4. 更简洁的代码

        注意:这并没有给出完整的命名空间。在这种情况下,name 将等于 Bar

        namespace Foo.Bar
        {
           string name = nameof(Foo.Bar);
        }
        

        【讨论】:

        • 就目前而言,这个答案具有误导性,因为它适用于单段命名空间。
        • @ThePademelon,从技术上讲确实如此。如果您想要包含您引用的名称空间的名称空间的名称,可以执行类似$"{nameof(ns1)}.{nameof(ns2)}" 的操作
        • 这种方法的一个缺点是,将方法移动到不同的命名空间需要您记住更新传递给 nameof() 的参数。
        【解决方案8】:

        如果您从需要捕获的命名空间中的类执行它,那么您可以使用:

        GetType().Namespace

        这很好用,因为它允许您重构命名空间并且仍然可以工作。

        【讨论】:

          【解决方案9】:

          作为汇总所有帖子的答案: 从以字符串 tableName 形式给出的表中获取所有列的值:

          var tableName = "INVENTORY_PRICE"; var assembly = Assembly.GetExecutingAssembly(); var tip = typeof(Form3); var t = assembly.GetType(tip.Namespace + "." + tableName); 如果(t!= null) { var foos = db.GetTable(t); foreach (var f in foos) { Console.WriteLine(f + ":"); foreach(f.GetType().GetProperties() 中的 var 属性) 如果(属性!= null) { var pv = property.GetValue(f, null); Console.WriteLine(" " + property.Name + ":" + pv); } Console.WriteLine("--------------------------------- ---"); } }

          如果我们使用 ado 很容易,这个示例使用 LINQ 上下文...

          【讨论】:

            猜你喜欢
            • 2011-02-06
            • 2013-04-01
            • 1970-01-01
            • 2013-02-03
            • 2010-12-23
            • 2011-09-20
            • 1970-01-01
            • 2011-03-10
            相关资源
            最近更新 更多