1 votes

Système de propriétés en C#

Mise à jour Désolé. Je ne voulais pas dire que toute la bibliothèque de réflexion était hors limites. Je parlais juste du truc incroyablement lent *.Invoke().

Salut,

J'ai besoin d'implémenter un système de propriété en C# qui permet à la fois l'accès normal aux propriétés

[property_attribute()]
return_type Property { get; set; }

et l'accès par chaîne de caractères

SetProperty(string name, object value);
object GetProperty(string name);

Cependant,

  1. Je ne veux pas enregistrer chaque propriété individuellement.
  2. Je ne veux pas utiliser la réflexion
  3. Je ne veux pas accéder aux propriétés par l'intermédiaire d'un dictionnaire (c'est-à-dire pas de PropertyTable["abc"]=val; )

Ce schéma est nécessaire pour un schéma de calcul en grappe où je dois définir les propriétés à distance et localement. Toutes les propriétés auront un attribut personnalisé qui sera lu à l'initialisation. J'espère obtenir des performances d'exécution constantes.

Actuellement, mon idée est d'avoir un analyseur/préprocesseur personnalisé qui analyse/compile les scripts au moment de l'exécution et génère le code set/get comme suit :

object GetProperty(string name)
{
     if(name = "blah")
           return Property1;
     ...
}
...

Cependant, je ne pourrai pas déboguer le code avec ce schéma. Quelqu'un peut-il penser à une solution ?

Merci

2voto

LorenVS Points 5784

La meilleure solution consiste à générer une méthode dynamique au moment de l'exécution à l'aide de System.Reflection.Emit. Vous obtiendrez d'excellentes performances et, une fois que vous l'aurez fait fonctionner correctement, le débogage ne devrait pas poser de problème. (Vous devriez pouvoir compter sur son fonctionnement, je ne vois pas pourquoi).

Je préfère l'approche des méthodes dynamiques parce qu'elle ne dépend pas de la génération de code au moment de la compilation, ni du marquage des attributs ou de ce genre de choses. Vous pouvez la faire fonctionner sur n'importe quel objet et elle fonctionnera pour toutes les propriétés publiques gettable/settable de cet objet.

1voto

eulerfx Points 16320

Vous pouvez essayer PostSharp pour créer ces attributs et faire en sorte que la classe implémente l'interface getter/setter. Techniquement, il utilise la réflexion, mais il crée des assemblages au moment de la compilation, donc ce n'est pas la méthode typique de System.Relfection.

Si votre objectif principal est de travailler à distance, vous devrez tout de même configurer une sorte de service Web ou de service WCF, auquel cas vous disposerez d'un proxy, qui pourra à son tour utiliser le cadre mentionné pour définir des attributs. Les services Web utilisent intrinsèquement la réflexion de toute façon, il n'y a donc aucun moyen de contourner ce problème.

1voto

jpbochi Points 2380

Je pense qu'il sera difficile de trouver une bonne solution qui n'utilise pas DynamicMethod .

Comme je l'ai commenté sur LorenVS Vous pouvez utiliser la réponse de DynamicMethod indirectement par Arbres d'expression .

J'ai implémenté un générateur de délégués simple en utilisant des arbres d'expression. C'est sur code.google.com, donc vous pourriez vouloir y jeter un coup d'oeil : LateBoundMethodFactory.cs . Il manque encore une documentation appropriée, mais le code est bien commenté (bien plus que ce que je fais habituellement).

Mise à jour : lien mis à jour

0voto

jameszhao00 Points 2654

Je viens de trouver ceci en cherchant DynamicMethod.

http://msmvps.com/blogs/jon%5Fskeet/archive/2008/08/09/making-reflection-fly-and-exploring-delegates.aspx

Il s'avère que vous pouvez créer un délégué getter/setter à partir d'un PropertyInfo et obtenir des performances getter/setter quasi natives.

0voto

Si vous ne voulez pas enregistrer chaque propriété individuellement, vous pouvez adopter l'approche suivante

protected void SetPropertyValue&ltV>(string propertyName, V value) { ViewState[propertyName] = valeur ; }

protected V GetPropertyValue&ltV>(string propertyName, V nullValue) { //Here nullValue peut être string.Empty ou true || false ou 0 etc.... //la valeur par défaut que nous voulons retourner si ViewState[propertyName] est null.... if (ViewState[propertyName] == null) { retourne nullValue ; } return (V)ViewState[propertyName] ; }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X