繁体   English   中英

C# - 从程序集中获取资源字符串的最快方法

[英]C# - Fastest way to get resource string from assembly

我真的不知道/不知道答案,知道使用 c# 的程序集中的resx文件中的键来查找资源值。(或者可能是我无知)。

什么是最快的代码,我可以使用资源文件中的键检索string valuesvalues的方式,该资源文件作为资源嵌入到程序集中。 我在资源文件中存储异常的友好消息,并希望在需要时使用它们。

是否存在用于此目的的静态类?

是否有我可以使用的开源成熟项目?

如果资源与代码在同一个程序集中,则执行以下操作:

String resourceValue = MyAssemblyNameSpace.Properties.Resources.ResourceName

取自this SO answer

Assembly assembly = this.GetType().Assembly;
ResourceManager resourceManager = new ResourceManager("Resources.Strings", assembly);
string myString = resourceManager.GetString("value");
string val = Resources.ResourceManager.GetString("resource_name");

给定"resource_name"您可以检索资源值。

您可以使用 ResourceManger 从 Assembly 中获取字符串值

从程序集获取资源

ResourceManager ResManager= new ResourceManager("yourResource", 
            Assembly.GetExecutingAssembly());
String strResourveValue = ResManager.GetString("YourStringKey");

当我为名为 UnitTests 的 C# 类库类型的单元测试创​​建一个新项目时,我右键单击并添加了一个新资源。 我将其命名为 UnitTestsResources。 我向该资源添加了 2 个字符串。 然后我就可以像这样方便地访问它们

UnitTestsResources.NoDeviceRequireMsg

我很好奇它是如何工作的,所以我提取了资源文件背后的代码,这是有道理的。 Visual Studio 使用静态访问器创建了一个内部类.. 对我来说看起来像这样

[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class UnitTestsResources {

    //Some auto generated code

    /// <summary>
    ///   Looks up a localized string similar to OPOS Device is required for test.
    /// </summary>
    internal static string DeviceRequireMsg {
        get {
            return ResourceManager.GetString("DeviceRequireMsg", resourceCulture);
        }
    }

    /// <summary>
    ///   Looks up a localized string similar to OPOS Device must not be installed for test.
    /// </summary>
    internal static string NoDeviceRequireMsg {
        get {
            return ResourceManager.GetString("NoDeviceRequireMsg", resourceCulture);
        }
    }
}

由于它仅用于我的单元测试,因此我对此感到满意。 希望它可以帮助别人。

 var thread = System.Threading.Thread.CurrentThread.CurrentUICulture.Name;
            var culture = new CultureInfo(thread);
            var resourceManager = new ResourceManager(typeof(Resources.Resource));
            string value = resourceManager.GetString(name, culture);

为了改进 Herzbube 的回答,我将展示我是如何实现的......

无需为资源文件创建项目或文件夹,只需右键单击您的项目并添加 -> 新项目,然后选择资源文件。 打开你的字符串中的资源文件,保存为一个有用的名称,然后导航到你想要使用它们的 C#,然后它只是:

String resourceValue = MyProjectName.MyResourceFileName.MyResourceRowItem;

如果这不起作用,请注意在resx文件中的访问修饰符下拉列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM