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?
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 .
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
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;
typeof(Foo).ToString()
?
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)
.
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");