在C#中将类名作为字符串获取

70

有没有一种方法可以将C#中的类名转换为字符串?

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

因此,我是否可以这样做:

class Foo
{
}

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

我认为在没有实例的情况下无法使用GetType()。 有什么建议吗?

7个回答

109

如果没有实例,你不能使用.GetType(),因为GetType是一个方法。

但是你可以通过以下方式从类型中获取名称:

typeof(Foo).Name

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

typeof(Foo).AssemblyQualifiedName

12

谢谢Craig,我还发现了这个链接也很有帮助:http://msmvps.com/blogs/matthieu/archive/2008/06/06/entityframework-include-with-func.aspx - Jared

8
您也可以这样做:
Type CLASS = typeof(MyClass);

然后您只需访问名称,命名空间等即可。

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

4

如果不使用 typeof(Foo).ToString(),您可以使用nameof()

nameof(Foo)

2
typeof(Foo).ToString()

?


0
你可以使用 DbSet<contact> 代替 ObjectSet<contact>,这样你就可以将 lambda 表达式作为参数使用,例如 tblBar.Include(a => a.foo)

0

另一个使用反射的替代方法是使用MethodBase类。

在您的示例中,您可以添加一个静态属性(或方法),以提供您想要的信息。例如:

class Foo
{
    public static string ClassName
    {
        get
        {
            return MethodBase.GetCurrentMethod().DeclaringType.Name;
        }
    }
}

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

tblBar.Include(Foo.ClassName);

在运行时将会给你:

tblBar.Include("Foo");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接