Design-Frage
-
Hellsgore schrieb:
Du stehst jetzt mit meiner Lösung nur noch ein bisschen im Konflikt.. du musst es auf C++.Net umrotzen.
Ich machs acuh mit C#.
Danke für deine ausführliche Antwort, versuche sie jetzt zu verstehen
-
OK, so weit so klar.
Im oberen Beispiel hätte ich also dann ne ActionItems-Collection mit zwei Items drin.
Im ersten Fall:
Item1.Name="First", Item1.DataType=Path, Item1.Value="C:\test1.bin"
Item2.Name="Second", Item2.DataType=Path, Item2.Value="C:\test2.bin"
Im zweiten Fall:
Item1.Name="First", Item1.DataType=string, Item1.Value="somedatahere"
Item2.Name="Second", Item2.DataType=string, Item2.Value="someotherdatahere"Wenn ich das grad richtig seh, macht dein Code es ein bisschen anders.
Jedenfalls geht es jetzt darum, die Funktion aufzurufen. Geht folgendes?
Compare(items[0].Value as items[0].DataType, items[1].Value as items[1].DataType);
-
Nein, geht nicht. Wie dann?
-
Wenn ich Dir richtig verstehe, ist das ein Castingproblem, oder?
Wenn Du den DataType auswertest, kannst Du ja den Value-Inhalt (String oder Path etc.) entsprechend casten und dann die Methode mit den gecasteten Parametern aufrufen, oder geht es Dir darum, nur einen Methodenaufruf zu codieren, der sowohl Path als auch String annimmt? Geht denn letzteres?
Das wäre doch dann eher ein Fall von variabler Anzahl Parameter...? Bzw. Du übergibst nur Objekte und sagst der Methode in einem weiteren Parameter, was für eine Art Objekt es ist, damit die Methode intern casten kann...?
-
Ich will ein "runtime-casting" machen, wenn man das so bezeichnen kann..
Klar, ich könnte folgendes machen:if(items[0].Type==typeof(Path) && items[1].Type==typeof(Path)) Compare(items[0].Value as Path, intems[1].Value as Path); else if(items[0].Type==typeof(string) && items[1].Type==typeof(string)) Compare(items[0].Value as string, intems[1].Value as string);
Aber das ist alles andere als schön und genau deswegen will ich es vermeiden.
-
Was gefällt Dir denn an der "Object"-Vorgehensweise nicht? Das entspräche ja dem Void bei C/C++ und es wäre das Verfahren, daß man in solchen Situationen anwenden würde. Und dabei handelt es sich ja um ein Runtimecasting...?
-
Nein, das ist einfach unschön. Was du mit void meinst, weiss ich nciht. Hinter Polymorphismus steckt ja gerade, dass man sowas nciht mehr machen muss.
-
Ich mach zu dieser Frage mal nen neuen Thread auf.
-
Servus,
ich glaube du denkst dort etwas zu kompliziert. Ich behaupte jetzt einfach mal, dass es nicht gehen wird, was du vorhast. Dann würde ich dir in dem Fall einfach raten einen Switch-Case Block zu machen und auf den Datentyp zu achten.
Mich würde jetzt genauer interessieren, was die Methode Compare macht. Willst du einfach die Inhalte der Items überprüfen bzw. vergleichen, ob sie gleich oder ungleich sind, dann kannste das so machen:
ActionItem item = new ActionItem(); item.Name = "Compare"; item.DataType = typeof(string); item.Values = new object[] {"Test1", "Test2"}; int comp = Comparer.DefaultInvariant.Compare(item.Values[0], item.Values[1]); //Less than zero = a is less than b. //Zero = a equals b. //Greater than zero = a is greater than b.
mfg
Hellsgore
-
Nein, will ich nicht. Es wird ein etwas komplizierterer Vergleich.
Ich habe auch das Gefühl, dass das nicht geht, was ich will... Siehe dazu auch meinen anderen Thread...