在 C# 中以字符串形式获取类的名称

Posted

技术标签:

【中文标题】在 C# 中以字符串形式获取类的名称【英文标题】:Get the name of a class as a string in C# 【发布时间】:2010-09-15 20:01:18 【问题描述】:

有没有办法在 C# 中获取类名并将其转换为字符串?

作为 Entity Framework 的一部分,.Include 方法接受一个以点分隔的字符串列表,以便在执行查询时加入。我有想要加入的类模型,出于重构和未来代码维护的原因,我希望在引用此类时能够具有编译时安全性。

因此,有没有办法可以做到这一点:

class Foo



tblBar.Include ( Foo.GetType().ToString() );

我认为没有实例我无法执行 GetType()。有什么想法吗?

【问题讨论】:

【参考方案1】:

您不能在没有实例的情况下使用 .GetType(),因为 GetType 是一种方法。

您可以像这样从类型中获取名称:

typeof(Foo).Name

正如 Chris 所指出的,如果您需要程序集限定名称,您可以使用

typeof(Foo).AssemblyQualifiedName

【讨论】:

【参考方案2】:

Include requires a property name,不是类名。因此,它是您想要的属性的名称,而不是其类型的名称。 You can get that with reflection.

【讨论】:

感谢 Craig,我发现这也有帮助:msmvps.com/blogs/matthieu/archive/2008/06/06/…【参考方案3】:

你也可以这样做:

Type CLASS = typeof(MyClass);

然后您就可以访问名称、命名空间等。

 string CLASS_NAME = CLASS.Name;
 string NAMESPACE = CLASS.Namespace;

【讨论】:

【参考方案4】:
typeof(Foo).ToString()

?

【讨论】:

【参考方案5】:

除了使用typeof(Foo).ToString(),您还可以使用nameof():

nameof(Foo)

【讨论】:

【参考方案6】:

您可以使用DbSet<contact> 代替ObjectSet<contact>,因此您可以使用lambda 作为参数,例如tblBar.Include(a => a.foo)

【讨论】:

【参考方案7】:

另一种使用反射的方法是使用 MethodBase 类。

在您的示例中,您可以添加一个静态属性(或方法),为您提供所需的信息。类似的东西:

class Foo

    public static string ClassName
    
        get
        
            return MethodBase.GetCurrentMethod().DeclaringType.Name;
        
    

这将允许您在不生成该类型实例的情况下使用它:

tblBar.Include(Foo.ClassName);

在运行时会给你什么:

tblBar.Include("Foo");

【讨论】:

以上是关于在 C# 中以字符串形式获取类的名称的主要内容,如果未能解决你的问题,请参考以下文章

从 Android Studio 中的 SQLite 数据库中以字符串形式检索数据

如何将xml传递给C#中的View?

在 Linux 中以 UTF-8 字符串形式获取环境变量

有没有办法在黑莓中以字符串的形式获取异常的堆栈跟踪?

c# winform 资源图片如何通过字符串拼凑的形式加载?

如何从索引中以字符串形式获取突出显示数据或如何将其打印出来?