C#根据需要导入不同的库

C# importing different libraries depending on need

我正在使用 Nunit 在 Selenium 中进行单元测试(以防万一)。

对于这个单元测试,我有一些库包含所有选项的不同语言翻译。 每个库都有一个 class 命名相同的东西,有大量的字符串都具有相同的名称,只是其中的字符串不同。 + 我有一个配置文件,您可以在其中选择要 运行 测试的语言。是否有一种聪明的方法来加载所需的语言库,以便我可以对字符串使用相同的变量?

在 JavaScript 中我可以使用 require(string)。由于输入是一个字符串,我可以使用一个变量来更改使用的实际文件,但将变量命名为相同的名称。

您可以将 json 用作已翻译字符串的存储空间,而不是 class 文件

 [{
    "Reference": "Hello World",
    "French": "Bonjour le monde",     
    "Japanese": "Harōwārudo"
}]

然后就可以创建DTO了。

 public class OptionsTranslation
 {
    public string Reference { get; set; }
    public string French { get; set; }       
    public string Japanese { get; set; }
 }

你只需将 json 反序列化为对象,然后检索值

 var options = JsonConvert.DeserializeObject<List<OptionsTranslation>>(File.ReadAllText(<jsonFilepath>));
 var frenchOption = options.First(x=> x.Reference.Equals("Hello World").French;

希望对您有所帮助。

您可以使用反射根据配置文件中的值查找相应的程序集,然后新建一个库实例class。 像这样:

string typeString = "My.Assembly.Namesapce.MyClass, My.Assembly.Namesapce, Version=4.0.0.0, Culture=neutral, PublicKeyToken=84474dc3c6524430";

// Get a reference to the type.
Type theType = Type.GetType(typeString, true, false);

// Create an instance of that type.
MyClass  theInstance = (MyClass)Activator.CreateInstance(theType);

在这种情况下,您需要更改 typeString 取决于您在配置文件中选择的语言

或者,动态依赖注入似乎可以很好地解决您的问题。这个想法是,您注册可以在您的情况下注入的多种类型语言库。然后在运行时,您可以根据您设置的条件注入正确的库。

这是在 .Net Core 中实现此目标的良好指南: http://anthonygiretti.com/2019/01/31/implement-dynamic-dependency-injection-in-asp-net-core-2-2-example-with-multitenancy-scenario/