如何将命名空间检索到字符串 C#

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

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

这有几个优点:

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

注意:这并没有给出完整的命名空间。在这种情况下,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 上下文...

【讨论】:

以上是关于如何将命名空间检索到字符串 C#的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Windows.Security.Credentials.UI 命名空间包含到 C# 项目中

C# - 如何检查 C# 中是不是存在命名空间、类或方法?

C#中json的命名空间是哪个,还要添加啥引用?

将命名空间添加到 xml 根节点 c#

如何将文本框绑定到 XML 文件(带有命名空间)

C#中如何获得指定命名空间中所有自定义类的信息