mercredi 20 février 2019

Find all references/declarations of an object at runtime in c# | structuremap

I have a class LanguagePopupMessage which is used all over the application (and external libraries). If this class is constructed it fetches the namespace where it's created and adds a suffix to be unique.

During runtime I'm able to translate this complete namespace into my desired language (and also makes sense).

Now I have three possibilities how to fill my placeholder in the translation system:

  1. The application asks for a translation. If it's not existing it will be inserted without a translation in the translation system
    • This method is actually used and should be replaced
  2. Everytime I declare a LanguagePopupMessage in my code behind, I also have to manual insert the namespace into my translation system
    • extremely complicated procedure 👎
  3. My application performs a scan and lists all declarations including namespace and supplied fieldname parameter.
    • That should be the new solution; Here Im stuck how to solve it

Im using structuremap in my application. It's also scanning all libraries at startup, so maybe there is a possiblity how to automaticate it. 👀

using System;
using System.Diagnostics;

namespace ConsoleApp1
{
    /// <summary>
    /// Creates the namespace for a popup window and has an additional flag for the caption
    /// </summary>
    public class LanguagePopupMessage
    {
        public string Namespace { get; }
        public string Caption => $"{Namespace}Caption";

        public LanguagePopupMessage(string fieldName)
        {
            if(string.IsNullOrEmpty(fieldName))
                throw new ArgumentNullException(nameof(fieldName));
            if (_GetNamespace() is Type type)
            {
                Namespace = $"{type}.{fieldName}";
            }
            else
            {
                throw new InvalidOperationException("could not fetch the namespace");
            }
        }

        private Type _GetNamespace()
        {
            StackTrace st = new StackTrace();
            foreach (var sf in st.GetFrames())
            {
                var type = sf.GetMethod().DeclaringType;
                if (type != GetType())
                {
                    return type;
                }
            }
            return null;
        }

        public override string ToString()
        {
            return $"Namespace '{Namespace}' Caption '{Caption}'";
        }
    }

    class Program
    {
        //ConsoleApp1.Program.PopupMessage.ConfigNotLoaded
        //ConsoleApp1.Program.PopupMessage.ConfigNotLoadedCaption
        private static readonly LanguagePopupMessage _CONFIG_NOT_LOADED_POPUP_MESSAGE = new LanguagePopupMessage("ConfigNotLoaded");

        static void Main(string[] args)
        {
            Console.ReadKey();
        }
    }
}


namespace ConsoleApp1.Subfolder
{
    public class SubfolderClass
    {
        /// <summary>
        /// ConsoleApp1.Subfolder.SubfolderClass.FooMessage
        /// ConsoleApp1.Subfolder.SubfolderClass.FooMessageCaption
        /// </summary>
        public static readonly LanguagePopupMessage Message = new LanguagePopupMessage("FooMessage");
    }
}





Aucun commentaire:

Enregistrer un commentaire