8
votes

Comment puis-je faire référence à un setter d'une propriété?

J'ai du code ASP.NET qui remplit les champs d'un objet LINQ vers SQL (tous les champs de chaîne) avec des valeurs à partir d'un formulaire publié: xxx

Je veux stocker le nom de Le champ de formulaire et l'objet Setter associé dans une table, de sorte que je puisse itérer via l'ensemble de l'ensemble sans avoir à écrire un tas de code répété.

Y a-t-il un moyen d'obtenir un délégué à un établissement? C'est-à-dire que j'ai une classe myclass , avec une propriété à cordes myProperty . Puis-je obtenir un délégué, quelque chose comme void mypropertsetterdélégate (string val, myclass this) , qui peut être utilisé avec une instance de la classe?

Je sais que cela peut être fait avec Réflexion, mais d'autres développeurs de mon projet ont des problèmes de performance, donc je préférerais une solution non-réflexion si possible.

Merci!


3 commentaires

Peut-être que si vous avez posté une partie du code répété que vous essayez d'éviter, quelqu'un serait capable de mieux voir ce que vous essayez de faire.


Questions similaires: un , Deux , trois


BTW, il n'est pas nécessaire de mettre "C #" dans le titre, puisque vous l'avez déjà eu dans les tags.


5 Réponses :


7
votes

Vous pouvez utiliser un lambda: xxx

et vous avez une instance de myClass : xxx

Maintenant, à la suite de votre exemple: xxx

plus tard: xxx


3 commentaires

Cela nous ramène à la note n ° 1: vous devez ajouter chaque propriété manuellement à votre dictionnaire , qui semble être similaire à ce que OP tente d'éviter.


Ce qui peut être fait au démarrage de l'application Web et ne sera pas nécessaire après. Vous devez mourir un décès pour y parvenir.


Oui, vous devez écrire du code au moins une fois pour que cela soit exécuté, c'est évident. OP demande un moyen d'éviter un groupe de missions. Où ce code n'a pas d'importance. Il ne veut pas l'écrire pour chaque objet "Sélections". Heureusement, il y a un moyen de le faire, que j'ai décrit dans ma réponse.



0
votes
Action<string, MyClass> propertySetter = (val, @this) => { @this.Property = val; }

0 commentaires


4
votes

Vous pouvez utiliser la réflexion pour obtenir des informations sur le type que vous essayez de lier à la demande, puis générer des méthodes dynamiques (doit-la mettre en cache à réutiliser) pour rendre l'exécution vraiment rapide.

    public static Action<object, object> CreateSetter(FieldInfo field)
    {
        DynamicMethod dm = new DynamicMethod("DynamicSet", typeof(void),
            new Type[] { typeof(object), typeof(object) }, field.DeclaringType, true);

        ILGenerator generator = dm.GetILGenerator();

        generator.Emit(OpCodes.Ldarg_0);
        generator.Emit(OpCodes.Ldarg_1);
        if (field.FieldType.IsValueType)
            generator.Emit(OpCodes.Unbox_Any, field.FieldType);
        generator.Emit(OpCodes.Stfld, field);
        generator.Emit(OpCodes.Ret);

        return (Action<object, object>)dm.CreateDelegate(typeof(Action<object, object>));
    }


1 commentaires

Merci, fini par aller avec ça!