如何在所有项目中使用通用方法而不必传递名称空间

时间:2018-09-11 20:46:24

标签: c# .net design-patterns localization resx

我正在研究一起构成产品的所有5个项目中的文本本地化。

Localization:因此,如果用户来自美国,则他们将在en-US中看到产品,如果来自中国,则他们将在ch-CH中看到文本。

我被困在下面的东西中。

每个项目都有其 OWN 存储区的Resx文件(我将其保存用于翻译的文件)。

Project A - en-US.resx file
            cn-CH.resx file
Project B - en-US.resx file
            ch-CH.resx file
Project C - en-US.resx file
            ch-CH.resx file
.
.
.

现在我有一个项目Common,该项目被所有项目引用。 所以我在singleton

中写了一个Common
public sealed class Translation 
{
    private static readonly Translation translation = new Translation();

    public static Translation GetTranslation { get { return translation; } }
    private Translation() { }
    static Translation() { }

    public string GetTranslatedMessage(string key, CultureInfo culture, string message, string namespace)
    {
            var rm = new ResourceManager("namespace", Assembly.GetExecutingAssembly());
            message = rm.GetString(key, culture);
            return message;
    }
}

到目前为止,很好,您可以看到我正在将{strong> namespace 用作4th parameterresource manager,以便我可以在正确的项目存储区中查找翻译,只需执行以下操作即可:

Translation.Translate(key, culture, message, namespace) // singleton class taking in the namespace to find the right bucket

它工作正常。

问题/问题:但是对于每个项目,我都需要传递名称空间,这意味着我要调用的地方都需要传递名称空间。我想知道有什么办法,我可以隐式告诉每个项目需要研究哪个存储桶。我可以使用Abstract或2个singleton类,也许是factory吗?或类似的东西。我是新手,因此对如何解决此问题不熟悉。我只是不想在每个调用中传递名称空间。

WorkAround:我可以在每个项目中重复相同的单例代码并使工作正常,但是然后我将在每个项目中重复相同的单例代码/

1 个答案:

答案 0 :(得分:0)

如果您愿意接受hack-y解决方案,并且各种命名空间文件都位于以命名空间命名的文件夹中,则可以使用CallerFilePathAttribute并将命名空间从路径中分离出来。它似乎很脆弱:

查找C# Caller Information。他们显示的示例是:

public void DoProcessing()  
{  
    TraceMessage("Something happened.");  
}  

public void TraceMessage(string message,  
        [System.Runtime.CompilerServices.CallerMemberName] string memberName = "",  
        [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",  
        [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)  
{  
    System.Diagnostics.Trace.WriteLine("message: " + message);  
    System.Diagnostics.Trace.WriteLine("member name: " + memberName);  
    System.Diagnostics.Trace.WriteLine("source file path: " + sourceFilePath);  
    System.Diagnostics.Trace.WriteLine("source line number: " + sourceLineNumber);  
}  

// Sample Output:  
//  message: Something happened.  
//  member name: DoProcessing  
//  source file path: c:\Users\username\Documents\Visual Studio 2012\Projects\CallerInfoCS\CallerInfoCS\Form1.cs  
//  source line number: 31  

然后将其标记为source file path的内容进行路径游戏以获取名称空间。使用这些属性的参数始终是可选的(通常将其默认值设置为default(T))。编译器将注入该值,而调用方则不应。