web-dev-qa-db-fra.com

Récupère le nom d'une classe sous forme de chaîne en C #

Est-il possible de prendre un nom de classe et de le convertir en chaîne en C #? 

Dans le cadre de Entity Framework, la méthode .Include utilise une liste de chaînes délimitées par des points à joindre lors de l'exécution d'une requête. J'ai le modèle de classe de ce que je veux rejoindre, et pour des raisons de refactorisation et de maintenance du code, je souhaite pouvoir disposer d'une sécurité à la compilation lors du référencement de cette classe.

Ainsi, y a-t-il un moyen de faire cela:

class Foo
{
}

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

Je ne pense pas que je peux faire GetType () sans instance. Des idées?

65
Jared

Inclure nécessite un nom de propriété , pas un nom de classe. Par conséquent, c'est le nom de la propriété que vous voulez, pas le nom de son type. Vous pouvez obtenir cela avec réflexion .

12
Craig Stuntz

Vous ne pouvez pas utiliser .GetType() sans instance car GetType est une méthode.

Vous pouvez obtenir le nom du type mais comme ceci:

typeof(Foo).Name

Et comme Chris l'a fait remarquer, si vous avez besoin du nom qualifié de l'Assemblée, vous pouvez utiliser

typeof(Foo).AssemblyQualifiedName
100
Max Schmeling

Vous pouvez aussi faire quelque chose comme ça:

Type CLASS = typeof(MyClass);

Et ensuite, vous pouvez simplement accéder au nom, à l'espace de noms, etc.

 string CLASS_NAME = CLASS.Name;
 string NAMESPACE = CLASS.Namespace;
8
Glade Mellor
typeof(Foo).ToString()

?

2
Brian

Vous pouvez utiliser un DbSet<contact> au lieu de ObjectSet<contact>, vous pouvez donc utiliser lambda en tant que paramètre, par exemple tblBar.Include(a => a.foo).

0
Albino

Une autre alternative utilisant la réflexion consiste à utiliser la classe MethodBase.

Dans votre exemple, vous pouvez ajouter une propriété statique (ou une méthode) qui vous fournit les informations souhaitées. Quelque chose comme: 

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

Ce qui vous permettrait de l'utiliser sans générer une instance du type:

tblBar.Include(Foo.ClassName);

Ce qui au moment de l'exécution vous donnera:

tblBar.Include("Foo");
0
Gustavo Mori