2012-01-24 13 views
17

Naprawdę nie wiem/mam odpowiedzi, wiedzy, aby znaleźć wartość zasobów za pomocą klucza z pliku resx w zespole przy użyciu C#. (Lub może jestem ignorantem).C# - Najszybszy sposób na pobranie ciągu zasobów z zespołu

Jaki byłby najszybszym kod, sposób mogę odzyskać string values lub values użyciu klucza z pliku zasobów, który jest osadzony jako zasobu w zespole. Przechowuję przyjazne wiadomości dotyczące wyjątków w pliku zasobów i chciałbym je wykorzystać w razie potrzeby.

Czy istnieje klasa statyczna do tego celu?

Czy są dostępne dojrzałe projekty open source, których mogę użyć w tym celu?

Odpowiedz

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

Cześć, dziękuję za kod. Czy lin1 nie stosuje refleksji? jak może to być wykonawca. – Deeptechtons

+1

@Deeptechtons, Yeah - sorta ma. Właściwie nie myślę, że GetType().Montaż jest bardzo powolny, ale nawet jeśli tak jest, prawdopodobnie po prostu wykonasz to wcześniej w swoim programie. Chodzi o to, że przechowujesz 'resourceManager' gdzieś w głównym obiekcie swojej aplikacji i używasz go, gdy potrzebujesz łańcucha. – sblom

+0

Czy zespół zapewnia zdarzenia na wczesnym etapie cyklu życia, tak że po wystąpieniu wyjątku po prostu uzyskuję ciąg znaków, a nie instancję za każdym razem. – Deeptechtons

4

można użyć ResourceManger aby uzyskać wartość ciągu od Zgromadzenie

Get Resource from Assembly

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

Jeśli zasób jest w tym samym zespole co kod, a następnie dodaje się zrobi:

String resourceValue = MyAssemblyNameSpace.Properties.Resources.ResourceName 

Zaczerpnięte z this SO answer.

+0

Po prostu łatwiejsze przejście przez obiekt resourceManager. Dzięki. – C4u

1

Kiedy zrobiłem nowy projekt dla moich testów jednostkowych biblioteki typu C# o nazwie UnitTests, kliknąłem prawym przyciskiem i dodano nowy zasób. Nazwałem to urządzenie UnitTestsResources. Dodałem 2 ciągi do tego zasobu. Byłem wtedy w stanie wygodnie móc korzystać z nich jak ten

UnitTestsResources.NoDeviceRequireMsg

Byłem ciekaw, jak to działa, więc zatrzymał się kod za pliku zasobów i ma to sens. Visual Studio popełnił wewnętrznego klasy z akcesorów statycznych .. Wygląda to dla mnie

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

Ponieważ jest tylko dla moich testów jednostkowych Jestem zadowolony z tego. Mam nadzieję, że pomaga komuś innemu.

1

Aby pokażę w jaki sposób realizowane to poprawić odpowiedź herzbube za ..

zamiast tworzenia projektów lub foldery do pliku zasobów, wystarczy kliknąć prawym przyciskiem myszy projekt i nie Add-> nowy element, a następnie wybierz plik zasobów . Otwórz plik zasobów w swoich ciągach znaków, zapisz jako przydatną nazwę i przejdź do C#, gdzie chcesz z nich korzystać, a następnie:

String resourceValue = MyProjectName.MyResourceFileName.MyResourceRowItem;

Jeśli to nie działa, zwróć uwagę na rozwijanie modyfikatora dostępu w pliku resx.

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

Po otrzymaniu "resource_name" można pobrać wartość zasobów.

+1

Idealne ..... !!! –

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

Tego właśnie szukałem! Zawsze staram się unikać ciągów takich jak inne konstruktory ResourceManager. – madannes

Powiązane problemy