2012-01-24 38 views
17

Tôi thực sự không biết/có câu trả lời, kiến ​​thức để tìm một giá trị tài nguyên bằng cách sử dụng khóa từ tệp resx trong một assembly bằng C# (hoặc có thể là tôi không biết gì).C# - Cách nhanh nhất để lấy chuỗi tài nguyên từ assembly

Điều gì sẽ là mã nhanh nhất, cách tôi có thể lấy string values hoặc values sử dụng một chìa khóa từ một tập tin tài nguyên đó là nhúng như tài nguyên trong một lắp ráp. Tôi đang lưu trữ các thông báo thân thiện cho các ngoại lệ trong tệp tài nguyên và muốn sử dụng chúng khi được yêu cầu.

Lớp tĩnh có tồn tại cho mục đích này không?

Có các dự án trưởng thành nguồn mở nào mà tôi có thể sử dụng cho điều này không?

Trả lời

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

Xin chào, cảm ơn mã. Không phải lin1 sử dụng sự phản chiếu? làm thế nào có thể thực hiện được điều này. – Deeptechtons

+1

@Deeptechtons, Yeah - sorta. Tôi thực sự không nghĩ rằng GetType().Hội là tất cả những gì chậm, nhưng ngay cả khi nó được, có lẽ bạn chỉ cần làm điều đó một thời gian sớm trong chương trình của bạn. Ý tưởng là bạn sẽ stash 'resourceManager' ở đâu đó trong đối tượng chính của ứng dụng hoặc thứ gì đó và chỉ sử dụng nó khi bạn cần lấy một chuỗi. – sblom

+0

Có một hội đồng cung cấp sự kiện sớm trong vòng đời, do đó, do ngoại lệ thời gian xảy ra tôi chỉ nhận được để lấy chuỗi thay vì instantiating mỗi lần. – Deeptechtons

4

bạn có thể sử dụng ResourceManger để có được giá trị chuỗi từ hội

Get Resource from Assembly

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

Nếu tài nguyên là trong lắp ráp giống như mã số, sau đó sau đây sẽ làm:

String resourceValue = MyAssemblyNameSpace.Properties.Resources.ResourceName 

Lấy từ this SO answer.

+0

Chỉ là một cách dễ dàng hơn khi thực hiện điều này. Cảm ơn. – C4u

1

Khi tôi thực hiện một dự án mới cho các bài kiểm tra đơn vị của tôi về thư viện lớp C# được gọi là UnitTests, tôi đã nhấp chuột phải và thêm một tài nguyên mới. Tôi đã đặt tên là UnitTestsResources. Tôi đã thêm 2 chuỗi vào tài nguyên đó. Tôi đã sau đó có thể thuận tiện có thể truy cập chúng như thế này

UnitTestsResources.NoDeviceRequireMsg

Tôi đã tò mò làm thế nào mà làm việc vì vậy tôi kéo lên mã đằng sau các tập tin tài nguyên và nó có ý nghĩa. Visual Studio tạo một lớp nội bộ với accessors tĩnh .. Nó trông như thế này đối với tôi

[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); 
     } 
    } 
} 

Vì nó chỉ dành cho các bài kiểm tra đơn vị của tôi Tôi thỏa mãn với điều này. Hy vọng nó sẽ giúp người khác.

1

Để cải thiện về câu trả lời herzbube của tôi sẽ hiển thị như thế nào tôi thực hiện điều này ..

Thay vì tạo ra các dự án hoặc các thư mục cho các tập tin tài nguyên, chỉ cần nhấp chuột phải vào dự án của bạn và đừng Add-> mục mới, sau đó chọn tập tin nguồn . Mở thanh tài nguyên trong chuỗi của bạn, lưu dưới dạng tên hữu ích và điều hướng đến C# nơi bạn muốn sử dụng chúng, sau đó chỉ là:

Tài nguyên chuỗiValue = MyProjectName.MyResourceFileName.MyResourceRowItem;

Nếu điều đó không hoạt động, hãy chú ý đến trình đơn sửa đổi truy cập thả xuống khi bên trong tệp resx của bạn.

7
string val = Resources.ResourceManager.GetString("resource_name"); 

Tặng "resource_name" bạn có thể truy xuất giá trị tài nguyên.

+1

Hoàn hảo ..... !!! –

1
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); 
+0

Đó là cái tôi đang tìm kiếm! Tôi luôn cố gắng tránh các chuỗi như các nhà xây dựng ResourceManager khác sử dụng. – madannes

Các vấn đề liên quan