2010-06-04 15 views
0

Possible en double:
Reflection. What can we achieve using it?Qu'est-ce que la réflexion et à quoi peut-elle servir dans C#?

Je vois beaucoup d'exemples d'utilisation de la réflexion en C#, mais je ne sais pas exactement ce que tout ce qu'il est principalement utilisé dans C#. Alors quand l'utilisez-vous?

+3

duplication possible de [Réflexion. Que pouvons-nous réaliser en l'utilisant?] (Http://stackoverflow.com/questions/1897712/reflection-what-can-we-achieve-using-it) - et environ 50 autres questions. – Aaronaught

Répondre

1

Il y a beaucoup de façons de l'utiliser. Une façon dont je l'utilise est dans les tests unitaires quand j'ai besoin de corrompre une variable privée pour faire échouer un test unitaire (pour simuler des scénarios de test de défaillance). Par exemple, si je veux échouer à l'échec d'une connexion à la base de données, alors je pourrais utiliser la méthode ci-dessous pour modifier la variable privée connectionString dans une classe qui fonctionne avec la base de données. Cela provoquerait l'échec de la connexion DB lorsque j'essayais de me connecter à la base de données, et dans mon test unitaire je peux vérifier que l'exception correcte est levée.

Ex:

/// <summary> 
/// Uses reflection to set the field value in an object. 
/// </summary> 
/// 
/// <param name="type">The instance type.</param> 
/// <param name="instance">The instance object.</param> 
/// <param name="fieldName">The field's name which is to be fetched.</param> 
/// <param name="fieldValue">The value to use when setting the field.</param> 
internal static void SetInstanceField(Type type, object instance, string fieldName, object fieldValue) 
{ 
    BindingFlags bindFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic 
     | BindingFlags.Static; 
    FieldInfo field = type.GetField(fieldName, bindFlags); 
    field.SetValue(instance, fieldValue); 
} 
2

Un cas dans le monde réel:

Une fonction qui lorsqu'il est passé le nom de l'espace de noms regarde à travers toutes les classes dans l'espace de noms et si elle trouve une fonction « SelfTest » dans la classe qu'il appelle, instanciant un objet si besoin est. Cela me permet de déclarer les fonctions de test dans le cadre des objets et de ne pas avoir à se soucier de maintenir une liste de tests.

0

Voyez comment Microsoft utilise dans une web.config par exemple :)

Je l'ai utilisé quand je dois filtrer les éléments (en utilisant ItemFilter propriété) de AutoCompleteBox. La ItemSource a été définie avec Linq. Comme chaque objet était de type Anonymous, j'ai utilisé la réflexion pour obtenir des propriétés et effectuer le filtre que je désire.

1

La relecture est une technique qui permet aux développeurs d'accéder à Métadonnées du type/instance lors de l'exécution.
L'utilisation la plus courante consiste à définir CustomAttribute et à l'utiliser au durée d'exécution. CustomAttribute a été utilisé dans ORM, ASP.Net ActionFilter, cadre de tests unitaires, etc.

Cory Charlton a très bien répondu à cette question:

Reflection. What can we achieve using it?

1

En général, tout ce qui touche le type System.Type peut être considéré réflexion. Il est souvent utile (entre autres choses) pour toutes sortes de scénarios Convention over Configuration.

Prenons un exemple où vous voulez créer une instance d'un type que vous ne savez pas avant l'exécution:

public interface IVegetable { 
    public float PricePerKilo {get;set;} 
} 

public class Potato : IVegetable { 
    public float PricePerKilo {get;set;} 
} 

public class Tomato : IVegetable { 
    public float PricePerKilo {get;set;} 
} 

public static class Program { 
    public static void Main() { 
    //All we get here is a string representing the class 
    string className = "Tomato"; 
    Type type = this.GetType().Assembly.GetType(className); //reflection method to get a type that's called "Tomato" 
    IVegetable veg = (IVegetable)Activator.CreateInstance(type); 
    } 
} 
+0

+1 Jamais entendu parler de "Convention over Configuration", cela semble être une bonne idée. J'ai fait des choses similaires moi-même, mais cela prend ce que je faisais dans mes expériences et va encore plus loin. –

0

Je l'utilise pour la validation/encodage, comme regarder à travers toutes les chaînes dans une classe et en les changeant en chaînes sécurisées HTML avant de les envoyer à un affichage Web.Similairement lors de la récupération des données de la vue, je cours un encodage/regex pour m'assurer que seuls les caractères html sécurisés sont utilisés. L'autre manière est d'écrire des plugins en C# où vous voulez que la fonctionnalité soit connue au moment de l'exécution. exemple du projet de code: http://www.codeproject.com/KB/cs/pluginsincsharp.aspx

0

Je l'ai utilisé pour compiler des listes de contrôles dans les pages (à partir d'une page totalement séparée) d'une application Web.

Il peut être utilisé pour dynamiquement instancier des classes, d'analyser les ensembles, la vérification des types ...

Il est ce qu'il dit, une réflexion, il permet à un programme de regarder lui-même.