2009-05-25 7 views
1

Comment obtenir les classes qui sont disponibles dans un fichier '.cs'. Comme nous pouvons obtenir les classes et méthodes dans une Assemblée à l'aide,Comment obtenir des classes et des méthodes à partir d'un fichier .cs en utilisant Reflections in C#.?

Assembly.GetTypes() and Type.GetMethods() 

pour obtenir la classe et les méthodes dans une assemblée.

De même comment obtenir toutes les classes présentes dans un fichier C# (fichier .cs). Je dois obtenir les cours dans un fichier .cs à partir duquel je peux facilement obtenir les méthodes dans les et d'autres détails comme paramètres des méthodes, etc.

Répondre

3

à court d'utiliser un analyseur C#, il n'y a aucun moyen direct de je le fais. Vous pouvez compiler le fichier .cs en utilisant CSharpCodeProvider (ce qui ne fonctionne que si le fichier est compilé seul et vous pouvez indiquer tous les assemblys référencés au compilateur) et utiliser la réflexion sur l'assemblage résultant.

+0

mais que se passe-t-il si mon projet est divisé en plusieurs fichiers .cs et que seule la compilation de tous les fichiers me donne un assemblage. J'ai besoin de chaque fichier .cs. – SyncMaster

+0

Je crois que vous devriez utiliser un analyseur C# pour obtenir ces données à partir de programmes C# semi-valides (comme Visual Studio le fait avec des sources C# incomplètes). –

0

Le compilateur efface toutes les notions d'un codefile de votre code lors de sa compilation. Cela étant dit, il est peut-être possible de récupérer les informations que vous voulez des symboles de débogage si elles sont disponibles dans votre assembly.

0

De avec la classe, vous pouvez toujours appeler

this.GetType() 

ou en dehors de la classe, vous pouvez toujours appeler

obj.GetType() 

Toutefois, lorsque vous compilez une application, qui est nécessaire pour travailler la réflexion, vous ne pouvez plus obtenir leurs définitions par fichier.

0

Je l'ai fait précédemment en appelant le compilateur C#, en compilant le fichier C# et en utilisant ensuite la réflexion sur le type sorti. Cela est possible si le fichier C# est un fichier autonome et n'a aucune dépendance. Cependant, la manière correcte serait d'utiliser un analyseur - ce qui n'est pas si facile à faire. Il y a quelques options disponibles, MinosseCC étant l'un d'entre eux. Incidemment, C# 5.0 rendra beaucoup plus facile de compiler du code à la volée en étant capable de compiler une chaîne et de récupérer du code exécutable. Je ne peux pas attendre cela - c'est sûr de confondre tout le monde qui lit mon code.

1

Je vous recommande d'utiliser un outil générateur de parser pour générer un rapide parseur C#, vous pouvez utiliser Antlr.

Aussi, vous pouvez vérifier this et this

0

Tout d'abord, il n'y a pas une telle chose que le fichier .cs dans lequel une classe est définie. Une classe peut être marquée comme partielle et les parties peuvent être définies dans plusieurs fichiers .cs. Lorsque vous compilez avec les informations de débogage, les noms de fichiers de chaque méthode restent dans l'assembly (pour chaque ligne du fichier source, les commandes IL correspondantes sont étiquetées).

Malheureusement, je ne connais pas un moyen facile d'obtenir cette information à partir de l'application en cours d'exécution (sans analyser le fichier d'assemblage manuellement).

Si vous appelez la méthode en toute sécurité, vous pouvez l'appeler et, en parallèle, construire une trace de pile (à partir d'un autre thread) - dans l'objet StackFrame, vous trouverez le nom de fichier d'origine. Mais c'est lent (comme vous devez appeler chaque méthode juste pour trouver que le nom de fichier est différent) et risqué (et si la méthode formate votre disque dur?). Donc, la seule façon de faire est d'essayer d'analyser vous-même le fichier .cs avec un analyseur comme AntLR.

Questions connexes