2015-09-08 11 views
10

Próbuję sprawić, aby moja aplikacja (dla Windows 10) działała pod .NET natywnym..net-native enum.GetValues ​​Problem

Utknąłem z następującym problemem: Enum.GetValues kończy się niepowodzeniem w środowisku wykonawczym z brakującymi metadanymi. Udało mi się uprościć testowanie tego problemu (w rzeczywistości mój kod wygląda inaczej). W przenośnej biblioteki mam:

public enum enumValues 
{   
    A1,  
    B1,   
    C1, 
} 

public class fff 
{ 
    public static object GetClass2Value() 
    { 
     return enumValues.B1; 
    } 
} 

w mojej aplikacji systemu Windows Uniwersalny wzywam następujący kod:

Array aaa = Enum.GetValues(fff.GetClass2Value().GetType()); 

Otrzymuję następujący wyjątek:

Informacje dodatkowe: „enumlibportable.enumValues [] "brakuje metadanych.

Problem polega na tym, że nie mam pojęcia, co dodać do pliku Default.rd.xml. Próbowałem dodać różne ciągi rd (podtyp emum, klasa enumValues, enumValues ​​[] itp.) Przy użyciu narzędzia Microsoft http://go.microsoft.com/fwlink/?LinkID=392859, ale nie miałem szczęścia.

UPDATE: wiem, że następujący kod będzie działać na moim testcase Enum.GetValues(typeof(enumValue)), ale nie można go używać w moim realnym projektem, ponieważ nie wiem dokładnie typ enum w moim realnym projektem.

+0

Zakładam prawdziwy kod to jest przypadek podklasy/interfejsu? Czy mógłbyś trochę to rozwinąć? – Nyerguds

+0

Cóż, zbyt dużo czasu zajmuje mi wyjaśnienie mojego prawdziwego projektu, dlatego poświęcam dużo czasu na znajdowanie przyczyny problemu i przygotowanie próbki. Opisałem wystarczająco dobrze mój problem. Problem polega na tym, że optymalizacja usuwa metadane enum, ponieważ nie jest jawnie przywoływana w aplikacji. Muszę powiedzieć kompilatorowi, aby nie usuwał tych metadanych. –

+0

Nie możesz utworzyć typu zwrotnego? – Herdo

Odpowiedz

0

Może można spróbować to może pomóc

Array aaa = (enumValues) Enum.Parse(typeof(enumValues), fff.GetClass2Value()); 
+0

W moim prawdziwym projekcie nie znam dokładnego typu i mogą to być różne typy wyliczeniowe, niestety nie mogę tego użyć. To chyba nie jest właściwe rozwiązanie. Jeśli dodaję nowe wyliczenie, będę musiał dodać to obejście dla każdego wyliczenia. Należy to zrobić w jakiś sposób poprzez definicje środowiska wykonawczego. –

5

To nie ma sensu do mnie, ale następujący ciąg RD pracował dla mojego testcase:

<Type Name="enumlibportable.enumValues[]" Browse="Required All"/> 
+0

Jedną z rzeczy, która jest użyteczna, jest użycie zbyt hojnej dyrektywy: . Spowoduje to, że wszystkie typy w twojej aplikacji będą miały wystarczającą ilość informacji, aby odzwierciedlenie tego typu zadziałało. Działa tak dobrze, jest zawarty w pustym szablonie UWP pod Właściwości \ Default.rd.xml! HTH –

+0

Znalazłem tę linię w moim projekcie, było tam i nie działa w moim przypadku. Podejrzeń, że jest to błąd w rodzimym .NET. –