Comment modifier une instance de valeur via le nom de la propriété d'objet en C#

黄舟
Libérer: 2017-09-18 11:01:29
original
3587 Les gens l'ont consulté

Extrait de : csdn

L'attribution d'une valeur à une propriété d'objet peut être effectuée via PropertyInfo.SetValue(), mais veuillez noter que le type de la valeur doit être cohérent avec la propriété.

Deux façons de créer des instances d'objet :

1.


var obj = Assembly.Load("AssemblyName").CreateInstance("AssemblyName"+"ClassFullName");
Copier après la connexion

2.

 
var
 obj = Activator.CreateInstance(ClassType);
Copier après la connexion

Lorsque l'instance est créée, vous pouvez maintenant attribuer une valeur à un certain attribut de l'instance actuelle. Tout d'abord, obtenez l'attribut à attribuer.


var property = obj.GetType().GetProperty("PropertyName");//此时可以使用GetProperty获取属性数组,循环进行赋值,这里主要讲解类型问题。
Copier après la connexion

L'affectation peut être effectuée via la méthode PropertyInfo.SetValue(), voir MSDN pour plus de détails.

Cas 1, le type d'attribut est un type connu, par exemple : int


int value=500;
property.SetValue(obj,value,null);
Copier après la connexion

Il est à noter ici que le type valeur doit être cohérent avec le type d'attribut, sinon TargetException sera levée.

Cas 2, le type d'attribut est un type connu et la valeur d'origine est un autre type. Par exemple : le type de cible est int et la valeur est string


string value="500";
property.SetValue(obj,int.TryParse(value),null);//类型转换。
Copier après la connexion

Les deux premiers cas sont très simples Parfois, les affaires seront plus compliquées, et le. Le type de cible est incertain et nécessite un jugement d'exécution du programme.

Cas 3, le type d'attribut est un type non générique inconnu, le type cible n'est pas sûr de savoir comment effectuer la conversion de type.


object value="500";
property.SetValue(obj,Convert.ChangeType(value,property.PropertyType),null);//类型转换。
Copier après la connexion

Cela résoudra la plupart des problèmes.

Je ne sais pas si vous l’avez remarqué, mais j’ai insisté sur les non-génériques dans le troisième cas. Les génériques ne fonctionnent-ils pas ?
Oui. Si vous utilisez simplement la méthode Convert.ChangeType() et que la conversion de type signale toujours une erreur, regardez d'abord le code suivant.

Même si le type cible et le type valeur sont cohérents, une erreur est toujours signalée lors de la conversion via Convert.ChangeType().
Pour résoudre ce problème, vous devez d'abord convertir le type de valeur d'attribut en type de base, puis effectuer la conversion Convertir. En regardant le code, aucune erreur ne sera signalée lors de l'utilisation de Convert.ChangeType() pour convertir un type nullable.
Ajoutez une vérification de jugement de base et le code sera plus complet.


if (!property.PropertyType.IsGenericType)
            {                //非泛型
                property.SetValue(obj, string.IsNullOrEmpty(value) ? null : Convert.ChangeType(value, property.PropertyType), null);
            }            else
            {                //泛型Nullable<>
                Type genericTypeDefinition = property.PropertyType.GetGenericTypeDefinition();                
                if (genericTypeDefinition == typeof(Nullable<>))
                {
         property.SetValue(obj, string.IsNullOrEmpty(value) ? null : Convert.ChangeType(value, Nullable.GetUnderlyingType(property.PropertyType)), null);
                }
            }
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal