Informations
Le sujet que vous avez demandé est indiqué ci-dessous. Toutefois, ce sujet ne figure pas dans la bibliothèque.

PropertyInfo.SetValue, méthode (Object, Object, Object[])

Définit la valeur de la propriété avec des valeurs d'index facultatives pour les propriétés d'index.

Espace de noms :  System.Reflection
Assembly :  mscorlib (dans mscorlib.dll)

public virtual void SetValue(
	Object obj,
	Object value,
	Object[] index
)

Paramètres

obj
Type : System.Object
Objet dont la valeur de propriété sera définie.
value
Type : System.Object
Nouvelle valeur de cette propriété.
index
Type : System.Object[]
Valeurs d'index facultatives pour les propriétés indexées. Cette valeur doit être null pour les propriétés non indexées.

Implémentations

_PropertyInfo.SetValue(Object, Object, Object[])

ExceptionCondition
ArgumentException

Le tableau index ne contient pas le type d'arguments requis.

ou

L'accesseur set de la propriété est introuvable.

TargetException

L'objet ne correspond pas au type cible ou une propriété est une propriété d'instance, mais obj est null.

TargetParameterCountException

Le nombre de paramètres dans index ne correspond pas à celui de la propriété indexée.

MethodAccessException

Une tentative non conforme d'accès à une méthode privée ou protégée à l'intérieur d'une classe s'est produite.

TargetInvocationException

Une erreur s'est produite pendant la définition de la valeur de propriété. Par exemple, une valeur d'index spécifiée pour une propriété indexée est hors limites. La propriété InnerException indique la cause de l'erreur.

Si cet objet PropertyInfo est un type valeur et que la value est null, alors, la propriété aura pour valeur la valeur par défaut de ce type.

Pour déterminer si une propriété est indexée, utilisez la méthode GetIndexParameters. Si le tableau résultant possède 0 (zéro) élément, la propriété n'est pas indexée.

Il s'agit d'une méthode pratique qui appelle l'implémentation du runtime de la méthode SetValue(Object, Object, BindingFlags, Binder, Object[], CultureInfo) abstraite, en spécifiant BindingFlags.Default pour le paramètre BindingFlags, null pour Binder, et null pour CultureInfo.

Pour utiliser la méthode SetValue, commencez par obtenir un objet Type qui représente la classe. À partir de Type, obtenez PropertyInfo. À partir de PropertyInfo, utilisez la méthode SetValue.

RemarqueRemarque

À partir du .NET Framework version 2.0 Service Pack 1, cette méthode peut être utilisée pour accéder aux membres non publics si l'autorisation ReflectionPermission avec l'indicateur ReflectionPermissionFlag.RestrictedMemberAccess a été accordée à l'appelant et si le jeu d'autorisations des membres non publics est limité au jeu d'autorisations de l'appelant ou un sous-ensemble de ce jeu. (Consultez Considérations sur la sécurité de la réflexion.)

Pour utiliser cette fonctionnalité, votre application doit cibler le .NET Framework version 3.5 ou une version ultérieure.

L'exemple qui suit déclare une classe nommée Example et dotée de trois propriétés : une propriété static (Shared dans Visual Basic), une propriété d'instance et une propriété d'instance indexée. L'exemple utilise la méthode SetValue pour modifier les valeurs par défaut des propriétés et affiche les valeurs d'origine et finales.

Le nom utilisé pour rechercher une propriété d'instance indexée avec réflexion varie selon le langage et les attributs appliqués à la propriété.

  • Dans Visual Basic, le nom de la propriété est toujours employé pour rechercher la propriété avec réflexion. Vous pouvez vous servir du mot clé Default pour transformer la propriété en propriété d'instance indexée, auquel cas vous pouvez omettre le nom au moment d'accéder à la propriété, comme dans l'exemple suivant. Vous pouvez aussi utiliser le nom de la propriété.

  • Dans C#, la propriété d'instance indexée est une propriété par défaut appelée « indexeur » et le nom n'est jamais utilisé pour accéder à la propriété dans le code. Par défaut, le nom de la propriété est Item et vous devez utiliser ce nom lorsque vous recherchez la propriété avec réflexion. Vous pouvez utiliser l'attribut IndexerNameAttribute pour donner un nom différent à l'indexeur. Dans cet exemple, le nom est IndexedInstanceProperty.

  • En C++, vous pouvez recourir au spécificateur default pour définir une propriété indexée comme propriété indexée par défaut (indexeur de classe). Dans ce cas, le nom de la propriété par défaut est Item et vous devez utiliser ce nom lorsque vous recherchez la propriété avec réflexion comme dans l'exemple fourni ici. Vous pouvez utiliser l'attribut IndexerNameAttribute pour donner un nom différent à l'indexeur de classe dans la réflexion mais ne pouvez pas accéder à la propriété dans le code à l'aide de ce nom. Une propriété indexée qui ne figure pas dans un indexeur de classe est accessible au moyen de son nom dans le code comme dans la réflexion.


using System;
using System.Reflection;
using System.Collections.Generic;
using System.Runtime.CompilerServices;

class Example
{
    private static int _staticProperty = 41;
    public static int StaticProperty    
    {
        get
        {
            return _staticProperty;
        }
        set
        {
            _staticProperty = value;
        }
    }

    private int _instanceProperty = 42;
    public int InstanceProperty    
    {
        get
        {
            return _instanceProperty;
        }
        set
        {
            _instanceProperty = value;
        }
    }

    private Dictionary<int, string> _indexedInstanceProperty = 
        new Dictionary<int, string>();
    // By default, the indexer is named Item, and that name must be used
    // to search for the property. In this example, the indexer is given
    // a different name by using the IndexerNameAttribute attribute.
    [IndexerNameAttribute("IndexedInstanceProperty")]
    public string this[int key]    
    {
        get
        {
            string returnValue = null;
            if (_indexedInstanceProperty.TryGetValue(key, out returnValue))
            {
                return returnValue;
            }
            else
            {
                return null;
            }
        }
        set
        {
            if (value == null)
            {
                throw new ApplicationException("IndexedInstanceProperty value can be the empty string, but it cannot be Nothing.");
            }
            else
            {
                if (_indexedInstanceProperty.ContainsKey(key))
                {
                    _indexedInstanceProperty[key] = value;
                }
                else
                {
                    _indexedInstanceProperty.Add(key, value);
                }
            }
        }
    }

    public static void Main()
    {
        Console.WriteLine("Initial value of class-level property: {0}", 
            Example.StaticProperty);

        PropertyInfo piShared = typeof(Example).GetProperty("StaticProperty");
        piShared.SetValue(null, 76, null);

        Console.WriteLine("Final value of class-level property: {0}", 
            Example.StaticProperty);


        Example exam = new Example();

        Console.WriteLine("\nInitial value of instance property: {0}", 
            exam.InstanceProperty);

        PropertyInfo piInstance = 
            typeof(Example).GetProperty("InstanceProperty");
        piInstance.SetValue(exam, 37, null);

        Console.WriteLine("Final value of instance property: {0}", 
            exam.InstanceProperty);


        exam[17] = "String number 17";
        exam[46] = "String number 46";
        exam[9] = "String number 9";

        Console.WriteLine(
            "\nInitial value of indexed instance property(17): '{0}'", 
            exam[17]);

        // By default, the indexer is named Item, and that name must be used
        // to search for the property. In this example, the indexer is given
        // a different name by using the IndexerNameAttribute attribute.
        PropertyInfo piIndexedInstance = 
            typeof(Example).GetProperty("IndexedInstanceProperty");
        piIndexedInstance.SetValue(
            exam, 
            "New value for string number 17", 
            new object[] { (int) 17 });

        Console.WriteLine(
            "Final value of indexed instance property(17): '{0}'", 
            exam[17]);       
    }
}

/* This example produces the following output:

Initial value of class-level property: 41
Final value of class-level property: 76

Initial value of instance property: 42
Final value of instance property: 37

Initial value of indexed instance property(17): 'String number 17'
Final value of indexed instance property(17): 'New value for string number 17'
 */


.NET Framework

Pris en charge dans : 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Pris en charge dans : 4, 3.5 SP1

Pris en charge dans :

Windows 7, Windows Vista SP1 ou ultérieur, Windows XP SP3, Windows XP SP2 Édition x64, Windows Server 2008 (installation minimale non prise en charge), Windows Server 2008 R2 (installation minimale prise en charge avec SP1 ou version ultérieure), Windows Server 2003 SP2

Le .NET Framework ne prend pas en charge toutes les versions de chaque plateforme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise du .NET Framework.

Ajouts de la communauté

Afficher:
© 2014 Microsoft