C# Schwierigkeiten beim Lösen eines Rätsels

Chris_S04

Commander
Registriert
Mai 2011
Beiträge
2.396
Hallo zusammen,

habe eine Frage bzgl. eines Code-Schnipsels, der mir heute im Zuge eines Rätsels unterbreitet wurde.

// Hint:
// <Reference Include = "PresentationCore"/>
int a = MS.Internal.ItemClass.NumberSignedClass;
int b = MS.Internal.ItemClass.SimpleMarkClass;
int index = a - b;

Wenn ich das nun in VS eintippe, komme ich damit nicht sehr weit, da der Compiler mit ItemClass nichts anfangen kann. Per using System.Reflection; erhalte ich dann die Meldung, dass aufgrund der Sicherheitsebene nicht darauf zugegriffen werden kann. Allerdings wurde mir als Tipp mit auf den Weg gegeben, dass Reflection ein schwieriger Weg sei, das Rätsel zu lösen und es einfacher ginge. Nur wie? Ich weiß gerade nicht wirklich weiter, evtl. kann mir ja einer von euch erklären, was zu tun ist. :-)
Schon einmal vielen Dank!

Mit freundlichen Grüßen, frohes Fest und schöne Feiertage! ;-)

Chris_S04
 
Lösung wäre in dem Fall 11 - 7 = 4

jedoch heißt dein erster Enum falsch ;) (NumberSignClass)

wie? Mit .NET Reflector einfach nach ItemClass gesucht und die Werte ausgelesen - viel einfacher kannst du nicht auf "internal" Klassen zugreifen

ansonsten Reflection ^^
 
Ah ok, vielen Dank!

Den .NET Reflector kenne ich ehrlich gesagt nicht und im Studium sind wir nicht so tief in diese Materie eingestiegen, deshalb kann ich mit Reflection leider nichts anfangen, soll heißen, ich weiß ehrlich gesagt (noch) nicht wirklich was das ist, bzw. wie das funktioniert.

Aber nochmal vielen Dank für die schnelle Antwort und deine Hilfe!

Noch eine kurze Frage an alle: Könnte mir das evtl. jemand erklären, wie ich das ohne den .NET Reflector hinbekommen könnte? Gern auch anhand von funktionierendem Code. ;-)
Würde mich doch sehr interessieren, da ich nach wie vor einfach nicht darauf komme...
 
Zuletzt bearbeitet:
Der Reflector macht, wie der Name schon sagt, nichts anderes als die .NET Assemblies per Reflection zu laden und zu analysieren --> das kannst du natürlich auch selbst machen:

Code:
//Pfad der Assembly findet man per Windows Suche
string path = @"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.0\PresentationCore.dll";

Assembly assembly = Assembly.LoadFrom(path);
Type[] types = assembly.GetTypes();

foreach (Type type in types)
{
    if (type.Name == "ItemClass")
    {
         //Erstmal rausfinden von welchem Typ "ItemClass" ist
         Type baseType = type.BaseType;                    

         //baseType ist Enum, deswegen:
         Type underlyingType = type.GetEnumUnderlyingType();
         string[] names = type.GetEnumNames(); //<-- Da drin existiert kein "NumberSignedClass"
         Array values = type.GetEnumValues();

         //underlyingType ist byte, deswegen kann man casten:
         byte b1 = (byte) values.GetValue(names.ToList().IndexOf("NumberSignClass"));
         byte b2 = (byte) values.GetValue(names.ToList().IndexOf("SimpleMarkClass"));

         int a = Convert.ToInt32(b1);
         int b = Convert.ToInt32(b2);

         int index = a - b;

         Console.WriteLine("Index: " + index);
         break;
    }
}

Wie es einfacher geht, das wüsste ich auch gern, ich hoffe mal da meldet sich noch jemand mit der Lösung ;)
 
Vielen Dank für die Antwort!
Da wäre ich vermutlich nie allein drauf gekommen, z.B. wuste ich gar nicht, dass ItemClass vom Typ Enum ist.

Vielen Dank für deine Hilfe, das hat mich jetzt neugierig gemacht mich einmal näher nit Reflection zu beschäftigen. ;-)

Ich kann ja nochmal posten, wenn man mir die "einfache Lösung" evtl. einmal verrät. :-D
 
Zuletzt bearbeitet:
Zurück
Oben