2010-11-22 6 views
1

J'ai un système multi-langues, et partout je ce que je qualifierais de « propriétés wrapper » dans toutes les classes, comme:.NET 4, Puis-je utiliser des attributs ou une autre fonctionnalité POO pour simplifier ce code?

Public Property Name(Optional ByVal ForceLanguageCode As String = Nothing) As String 
    Get 
     Return Translations.GetByCode(Me.EntityID, "name", ForceLanguageCode) 
    End Get 
    Set(ByVal value As String) 
     Translations.SetByCode(Me.EntityID, "name", value, ForceLanguageCode) 
    End Set 
End Property 

Je puis copier et coller ce code pour chaque traduisible champ. Je souhaite être en mesure de remplacer cela avec une ligne de code d'une manière ou d'une autre, avec une classe. La seule chose qui change à chaque fois est le nom du champ, comme "nom", "titre", ou "sujet", etc. Cela semble un peu un gâchis et je veux que mon système soit aussi facile à utiliser que possible pour les développeurs.

Je l'ai fait des recherches sur les attributs, mais je ne pense pas que ma réponse est que:

1) Je ne sais pas comment instancier automatiquement les objets, d'autant plus que cela étend une entité LINQ où la La signature New() est déjà générée par le DBML. Ma technique actuelle utilise des fonctions statiques.

2) "EntityID" est une information en temps réel, pas de compilation.

Quelqu'un pourrait-il suggérer comment je pourrais nettoyer ce gâchis?

Répondre

1

au lieu de chaînes que vous pouvez utiliser lamdas:
Retrieving Property name from lambda expression
De cette façon, vous obtenez au moins compiletime vérification.

Vous pouvez utiliser stackwalking pour déduire la méthode appelante et donc la propriété associée. Vous n'avez donc pas besoin de vous référer manuellement à la propriété. Mais je n'aime pas cette approche. Vous pouvez faire aspect-orientated programming avec une réécriture IL comme PostSharp. Ensuite, vous pouvez remplacer le code manuel par un attribut. PostSharp ajoute ensuite votre code standard aux sites avec cet attribut.

Mais je ne suis pas sûr si votre conception globale pour la localisation est bonne. Je ne l'ai jamais vu faire de cette façon. Et je ne comprends pas à quoi sert le setter.

+0

Désolé pour le très tard accepter. J'imagine qu'en essayant de résoudre mon problème, comprendre comment TryUpdateModel de MVC fonctionne serait utile, cela semble aussi parcourir les propriétés d'une certaine manière et les vérifier pour les attributs, etc. Va chercher dans la source MVC. –

Questions connexes