Laden...

Design-Frage: Pfad zu Property

Erstellt von nilres vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.943 Views
N
nilres Themenstarter:in
60 Beiträge seit 2010
vor 13 Jahren
Design-Frage: Pfad zu Property

Hallo Leute,

für ein etwas spezielles Projekt benötige ich folgende Funktionalität: Ich möchte zur Laufzeit den Weg zu einem Property/Wert festlegen. Es gibt dabei drei mögliche Ursprünge: 1. Es ist ein konstanter Wert (z.B. 25.0f) 2. Er ist in einem Übergabeparameter (das sind jeweils drei Verschiede) oder 3. in einer Statischen-Klasse. Bei den beiden letzten Lösungen gibt es das Problem dass man da dann einen Pfad festlegen muss an dessen Ende ein Property steht (z.B. Property ist in ÜbergabeparameterA->ObjectPropertyA->ObjectPropertyD->TargetProperty). Ich bin etwas überfragt wie ich diesen Abbilden soll. Und hoffe einer von euch hat da eine gute Idee.

Sinn ist das man in einer Applikation einen Ablauf festlegen kann und diese zweite Applikation wertet dies dann zur Auswertung aus. Geht so in die Richtung grafisch Programme anfertigen zu können (nur damit ihr eine Vorstellung habt, ist etwas speziell).

Danke schon mal!

Grüße
Nils

S
902 Beiträge seit 2007
vor 13 Jahren

HAllo,

leider kann ich mir niocht genau vorstellen was du vorhast, kannst du uns mal ein beispiel geben?

mfg
serial

1.820 Beiträge seit 2005
vor 13 Jahren

Hallo!

Leider erschließt sich auch mir aufgrund der Erklärung nicht genau das Ziel. Willst du die Properties in einer Hierarchie speichern und dann mittels Pfad (z.B. "/Root/Category/Sub-Category/KeyName") abrufen?

Nobody is perfect. I'm sad, i'm not nobody 🙁

N
nilres Themenstarter:in
60 Beiträge seit 2010
vor 13 Jahren

Vielleicht habe ich eher meine eigentliche Frage in zu viel drum herum versteckt. Ich versuche es daher mal einfacher:

Ich habe eine Funktion void DoWork(IParameter p1, IParameter p2, IParameter p3).
Das Interface IParameter definiert nur ein paar Basis Funktionalitäten. Die Implementierung eines solchen Parameters kann ein sehr umfangreiches Objekt sein welches wiederum eigene komplexe Typen beinhaltet. Nehmen wir mal an Klasse A Implementiert das Interface IParameter. Und beinhaltet jetzt ein Objekt der Klasse Foo diese Klasse Foo beinhaltet ein Objekt der Klasse Bar und diese Klasse Bar beinhaltet ein Property mit dem Namen Value vom Type Int32.
Die Funktion DoWork soll nun mit den Werten aus dem Property Int32 arbeiten. Hat aber keine Ahnung über die ganzen anderen Typen die es da so gibt (dynamisch als Plugin dazu geladen, etc. pp.) Jetzt soll man der Klasse in der die Funktion DoWork enthalten eine Konfiguration mitgeben die den Weg zu diesem Property beschreibt. Und genau da hakt es ein wenig. Wie beschreibt man so einen Weg?

P
67 Beiträge seit 2008
vor 13 Jahren

Da hast du meiner Meinung nach nur drei Optionen:

  1. Per Reflection. Nach und nach jeden Typen rekursiv anhand der Konfiguration raus suchen (Type.GetProperty(..) etc.)
  2. Pfade manuell auf die jeweiligen Objekte/Properties mappen
  3. Komplexere - aber meiner Meinung nach die sauberste - Lösung, das Builder-Pattern (aber auch hier wirst du ein Mapping benötigen) (kann sein das es ein wenig an dem Ziel vorbei geht. bräuchte man einen größeren Einblick in das Geschehen)

Religionskriege sind Konflikte zwischen erwachsenen Menschen, bei denen es darum geht, wer den cooleren, imaginaeren Freund hat

656 Beiträge seit 2008
vor 13 Jahren

Was spricht gegen eine GetInt32-Methode (oder Property, je nachdem) im IParameter Interface, die deine entsprechenden Werte zurückliefert (dann interessiert dich im DoWork nämlich auch nicht mehr, ob das Ding Value, Nested.SomeOtherClass.MyIntProperty oder MyCoolInteger heißt).

T
381 Beiträge seit 2009
vor 13 Jahren

Formuliere dein Beispiel lieber direkt als Beispielcode, der wäre deutlich schneller zu verstehen als der Text.

Mit der Anleitung aus deinem Text löse ich das ganze einfach so:


class Worker {
  ParameterPath p1Path; // Wird nicht benötigt.
  ParameterPath p2Path; // Wird nicht benötigt.
  ParameterPath p3Path; // Wird nicht benötigt.

  DoWork(IParameter p1, IParameter p2, IParameter p3) {
    int myInt = p1.IntProperty;
    // Do smth. with myInt
  }
}


public interface IParameter {
  int IntProperty{ get; set; }
}


public class A : IParameter {
  Foo myFoo;
  int IntProperty{ get {return myFoo.MyBar.Value; } }
}

public class Foo {
  Bar myBar;
  public Bar MyBar{ return myBar; }
}

public class Bar {
  public int Value { get return 10; }
}


N
nilres Themenstarter:in
60 Beiträge seit 2010
vor 13 Jahren

Danke ich denke so werde ich eine Lösung finden...