在 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 数据库中以字符串形式检索数据