Department of InformatiX
Microsoft .NET Micro Framework Tools & Resources

Vlastní indentifikační čísla resources

Pokud potřebujete načítat resources dynamicky, určitě by vám přišla vhod možnost ovlivnit resource ID generované při jeho vytvoření. Toho můžete docílit tímto snadným trikem (ne tak snadným na nalezení):

Za název resource dejte středník a číslo, které potřebujete (záporná lze rovněž). Resource designer sice bude hrozit červenými vykřičníčky, nicméně jde pouze o varování a program lze pez problémů zkompilovat a spustit s kýženým výsledkem. Např:

Resource Designer Screenshot

A příklad použití:

Debug.Print(Resources.GetString((Resources.StringResources)DateTime.Now.DayOfWeek));

Tato vymoženost však není zdokumentována (zřejmě kvůli vykřičníčkům) a může se ještě změnit.

 

Následující trik už bohužel ve verzi 3.0 nefunguje.

Vlastní resource enumeration

Další tip se týká enumů. Pokud několik resource názvů začnete stejně a oddělíte tečkou od zbytku, vygeneruje se vám speciální enum, na příklad:

MyFruitEnum.Apple
MyFruitEnum.Banana
MyFruitEnum.Orange

vygeneruje:

[System.SerializableAttribute()] internal enum MyFruitEnum : short { Banana = 16540, Apple = 27001, Orange = 31269, } internal class Resources { ... internal static string GetString(MyFruitEnum id) { return ((string)(Microsoft.SPOT.ResourceUtility.GetObject(ResourceManager, id))); } }

Tím pádem můžete resources získávat velmi snadno:

Debug.Print(Resources.GetString(MyFruitEnum.Apple));

Ani v tomto případě ale z vás nebude designer příliš nadšený. Dokonce můžete předchozí trik kombinovat s tímto, totiž vlastní enum s vašemi číselnými hodnotami (jako MyFruitEnum.Banana;4 atd.).

Nestačí?

Dobře, co byste tak řekli, že se stane, když budeme přidávat další tečky? Odpověď je: ne úplně nic, ale pořád nic použitelného. Ve skutečnosti můžete pomocí druhé tečky určit namespace (např. MyNamespace.MyFruitEnum.Apple atd.):

namespace MyNamespace { [System.SerializableAttribute()] internal enum MyFruitEnum : short { Apple = -4859, Orange = -3030, Banana = 21283, } }

Proč nic užitečného? Podívejme se na příslušnou metodu:

namespace MFConsoleApplication1 { ... internal class Resources { ... internal static string GetString(MyFruitEnum id) { return ((string)(Microsoft.SPOT.ResourceUtility.GetObject(ResourceManager, id))); } } }

Výsledkem je kompilační chyba, ježto MyFruitEnum nespadá do stejné namespace. Domnívám se, že to je bug v generování kódu.

Tři a více teček ponechávám čtenáři jako snadné cvičení.

Comments
Sign in using Live ID to be able to post comments.