68

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

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

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

class Foo
{
}

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

我不认为我可以在没有实例的情况下执行 GetType()。有任何想法吗?

4

7 回答 7

109

.GetType()没有实例就不能使用,因为GetType它是一种方法。

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

typeof(Foo).Name

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

typeof(Foo).AssemblyQualifiedName
于 2008-10-07T18:17:22.340 回答
12

Include 需要属性名,而不是类名。因此,它是您想要的属性的名称,而不是其类型的名称。 你可以通过反射得到

于 2008-10-07T18:21:19.757 回答
8

你也可以这样做:

Type CLASS = typeof(MyClass);

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

 string CLASS_NAME = CLASS.Name;
 string NAMESPACE = CLASS.Namespace;
于 2012-10-02T14:21:10.150 回答
2
typeof(Foo).ToString()

?

于 2008-10-07T18:17:44.007 回答
1

或者使用typeof(Foo).ToString(),您可以使用nameof()

nameof(Foo)
于 2022-02-15T15:07:53.060 回答
0

您可以使用 anDbSet<contact>而不是ObjectSet<contact>,因此您可以使用 lambda 作为参数,例如tblBar.Include(a => a.foo)

于 2011-07-15T19:06:20.893 回答
0

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

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

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

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

tblBar.Include(Foo.ClassName);

在运行时会给你:

tblBar.Include("Foo");
于 2013-11-19T19:15:40.370 回答