Maison >développement back-end >Tutoriel C#.Net >Comment modifier une instance de valeur via le nom de la propriété d'objet en C#

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

黄舟
黄舟original
2017-09-18 11:01:293624parcourir

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");

2.

 
var
 obj = Activator.CreateInstance(ClassType);

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获取属性数组,循环进行赋值,这里主要讲解类型问题。

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);

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);//类型转换。

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);//类型转换。

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);
                }
            }

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!

Déclaration:
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