2010-10-07 9 views
2

Fondamentalement, je voudrais faire quelque chose comme ça en haut de ma classe (je sais que cela ne fonctionne pas car ce n'est pas une constante). ...Comment puis-je transmettre une méthode d'exécution à un attribut personnalisé ou une approche alternative viable

[XmlStorage(IsSingleStorageFile = false, IsSubordinate = true, StorageLocation = "posts" + GetBlogId()]

Lorsque GetBlogId() serait une méthode utilitaire statique. Je construis un framework de stockage xml pour un moteur de blogs que j'écris (en partie un exercice d'apprentissage, en partie comme je veux donner quelque chose à l'open source) et je pensais que la façon la plus simple de déterminer l'emplacement de stockage serait d'utiliser des attributs personnalisés puisque je serais de toute façon utiliser un datacontrerserializer.

Mon seul problème à l'heure actuelle est de déterminer l'emplacement pour le type subordonné dont l'emplacement serait déterminé par l'ID de leur parent. Par exemple: < Blog.

Mon chemin de stockage serait quelque chose comme ça ...

messages \ blogid \ postid.xml

Lorsque l'identifiant blog serait déterminé en analysant l'url et retourner le blog associé. Cela me permettrait d'héberger plusieurs blogs dans une seule installation tout en conservant les fichiers de post-stockage séparés pour réduire les frais généraux de mémoire lors du chargement des messages.

Est-ce un non catégorique ou existe-t-il une meilleure façon de faire ce que je tente?

Edit:

Après réponse John J'ai essayé ....

private static string GetSubordinatePath(Type type) 
    { 
     if (typeof(ISubordinate).IsAssignableFrom(type)) 
     { 
      object instance = Activator.CreateInstance(type); 
      return (instance as ISubordinate).ParentGuid.ToString(); 
     } 
     else 
     { 
      // TODO: Localize this. 
      throw new ArgumentException(
      String.Format(
      CultureInfo.CurrentCulture, 
      "The specified type '{0}' does not impliment the ISubordinate interface. Please edit the source appropriately to enable storage.", 
      type.GetType().Name)); 
     } 
    } 

Ce qui serait appelé à partir de la classe de lecture l'attribut personnalisé.

Cela fonctionne bien ..

Répondre

2

C'est un pas droit pour les attributs ... les valeurs sont des constantes cuit dans les métadonnées.

Une option que vous pouvez utiliser serait d'avoir une sorte de templating intégré dans tout utilise les attributs ... de sorte que vous pourriez avoir un emplacement de stockage de posts\{GetBlogId()} et appelez la méthode au moment de l'exécution. Ce n'est pas vraiment élégant cependant ... vous pourriez envisager d'utiliser une interface à la place.

+0

Merci .... C'est ce que je pensais pour les attributs ... Pourriez-vous élaborer sur l'idée d'interface? Mon système est piloté par une interface de toute façon. –

+0

@James: Eh bien, si vous avez une interface, votre type pourrait implémenter cette interface et retourner tout ce qu'il voulait dynamiquement. –

+0

J'ai édité ma question avec une tentative à ceci ..... j'espère presque là. –