Existe-t-il un moyen en C # où je peux utiliser la réflexion pour définir une propriété d'objet?
Ex:
MyObject obj = new MyObject();
obj.Name = "Value";
Je veux régler obj.Name
avec réflexion. Quelque chose comme:
Reflection.SetProperty(obj, "Name") = "Value";
Y-a-t'il une façon de le faire?
c#
.net
reflection
properties
Melursus
la source
la source
var val = Convert.ChangeType(propValue, propInfo.PropertyType);
source: devx.com/vb2themax/Tip/19599obj.GetType().GetProperty("Name")?.GetSetMethod()?.Invoke(...)
CanWrite=False
types, non?Vous pouvez également faire:
où cible est l'objet qui aura sa propriété définie.
la source
Réflexion, essentiellement, à savoir
ou il existe des bibliothèques pour aider à la fois en termes de commodité et de performances; par exemple avec FastMember :
(qui a également l'avantage de ne pas avoir besoin de savoir à l'avance s'il s'agit d'un champ par rapport à une propriété)
la source
Ou vous pouvez envelopper un liner de Marc dans votre propre classe d'extension:
et appelez-le comme ceci:
Pour faire bonne mesure, ajoutons une méthode pour obtenir une valeur de propriété:
la source
Oui, en utilisant
System.Reflection
:la source
Utilisez quelque chose comme ça:
ou
la source
Vous pouvez également accéder aux champs de manière similaire:
Avec réflexion, tout peut être un livre ouvert :) Dans mon exemple, nous nous lions à un champ de niveau d'instance privé.
la source
Vous pouvez essayer ceci lorsque vous souhaitez affecter en masse les propriétés d'un objet à partir d'un autre objet à l'aide des noms de propriété:
la source
Je viens de publier un package Nuget qui permet de configurer non seulement les propriétés de premier niveau mais également les propriétés imbriquées dans l'objet donné à n'importe quelle profondeur.
Voici le package
Définit la valeur d'une propriété d'un objet par son chemin depuis la racine.
L'objet peut être un objet complexe et la propriété peut être une propriété imbriquée profonde à plusieurs niveaux ou elle peut être une propriété directement sous la racine.
ObjectWriter
trouvera la propriété en utilisant le paramètre de chemin de propriété et mettra à jour sa valeur. Le chemin de propriété est le nom ajouté des propriétés visitées de la racine à la propriété de noeud final que nous voulons définir, délimitées par le paramètre de chaîne de délimiteur.Usage:
Pour configurer les propriétés directement sous la racine de l'objet:
C'est à dire.
LineItem
la classe a une propriété int appeléeItemId
Pour configurer plusieurs niveaux de propriété imbriquée sous la racine de l'objet:
C'est à dire.
Invite
classe a une propriété appeléeState
, qui a une propriété appeléeInvite
(de type Invite), qui a une propriété appeléeRecipient
, qui a une propriété appeléeId
.Pour rendre les choses encore plus complexes, la
State
propriété n'est pas un type de référence, c'est unstruct
.Voici comment vous pouvez définir la propriété Id (sur la valeur de chaîne de «outlook») au bas de l'arborescence d'objets sur une seule ligne.
la source
Sur la base de la suggestion de MarcGravell, j'ai construit la méthode statique suivante: la méthode attribue de manière générique toutes les propriétés correspondantes de l'objet source à la cible à l'aide de FastMember
la source