Laden...
A
antoschka
myCSharp.de - Member
126
Themen
371
Beiträge
Letzte Aktivität
vor 15 Jahren
Dabei seit
26.12.2007
Erstellt vor 15 Jahren

Hallo,

ich suche Rat wie ich eine Anforderung am besten lösen könnte. Folgendes Problem:
Ich habe zwei Klassen:

ClassA
{

public string Name{get; set;}

private List<ClassB> AttributCollection{get; set;}
}

ClassB
{
public int Id{get; set;}
public string Type{get; set;}
public string ValueString{get; set;}
}

Eine Collection von ClassA wird an einen GridView gebunden und in einer Spalte soll das Property Name angezeigt werden.

Name ist allerding nur als Property in ClassA enthalten, der Wert ermittelt sich aus dem ValueString eines bestimmten Element der AttributCollection (z.B. dem Element bei dem Type == "Name" ist).

Spontan sind mir zwei Lösungswege eingefallen die beide nicht so dolle sind.

1.
im getter von Name rufe ich ein Methode auf:

string getName()
{
AttributCollection.Find(ac=> string.Equals(ac.Type,"Name")).ValueString;
}

=> Performancesorgen!!!!

2.
ValueString wird um ein event "ValueStringChanged" erweitert und ClassA bindet sich an das Event des einzelnen Element in der AttributCollection. Wertänderungen in der Instanz von Class B würden in eine lokales Feld "name" übernommen. Das wäre glaueb ich ziemlich performant, da die Daten zum Zeitpunkt des Zugriffs bereits verfügbar sind.

hier gibt’s zwei Probleme:

  • teilweise bekomme ich die ClassA instanzen und müsste bei jeder schauen ob das Element schon da ist => dann würde ich auf Veränderungen des Elements lauschen; wenn es nicht da ist müsste ich acht geben wenn es hinzugefügt wird und mich dann dran binden
  • Ob die Instanz von ClassB in der Collection das gesuchte ist, hängt noch von anderen Eigenschaften der Instanz ab (in Wahrheit gibt es noch mehr), wenn diese sich ändern müsste ClassA ebenfalls informiert werden

Fällt Euch eine elegantere Lösung ein.

besten Dank

antoschka

Erstellt vor 15 Jahren

sieht spannend aus. ich habe einzelne Kandidaten auf die greife ich sehr (!) häufig zu. Von daher könnte es sich durchaus lohnen.

Besten Dank für den Hinweis

Erstellt vor 15 Jahren

Hallo,

ich bekomme über eine Socketverbindung einen Property- oder Methodennamen (bei letzterem plus der notwendigen Parameter) und muss dann diese bei einem Objekt aufrufen. Das Ganze muss einigermaßen flink funktionieren.
Der wenigste Code würde sicher mit Reflection entstehen, aber ich glaube das ist nicht so besonders schnell. Macht die Verwendung eines Mammut-Switches Sinn?? Was könnte man noch in Erwägung ziehen?

Besten Dank

antoschka

Erstellt vor 15 Jahren

Ja und bei jeder Instanz wird dann das Framework hochgezogen, da das neue COM-Objekt ja mit einem managed code geschrieben wurde.
Das kostet Zeit die ich gern sparen möchte.

Besten Dank für Euer Feedback.

Bis dahin antoschka

Erstellt vor 16 Jahren

Hallo,

ich habe ein Problem zwei Welten zusammen zu bekommen. Wir haben ein COM Objekt (in c++ unmanaged) welches sehr groß ist - eine Neuprogrammierung wäre sehr aufwändig. Teile dieses COM Objektes sollen nun eine c# Anwendung nutzen.

Das Problem ist, dass ein Anstarten der c# Anwendung viel zu lange dauert, das COM-Objekt muss sehr häufig auf die C# Anwendung zugreifen und auch beim erstzugriff würde ich gern ein bereits instanziertes Objekt nutzen wollen, um die Zeit des Hochziehen des .Net Frameworks in diesem Moement einzusparen. Deshalb würde ich die Anwendung gern beim Systemstart mittels Windows Service ausführen und dann vom COM-objekt aus auf diese Anwendung zugreifen. Naiv bin ich da auf folgende Lösungsansätze gekommen, weiß aber noch nicht wie ich vom COM Objekt aus auf die Anwendung zugreife.

  • ich habe einen Windows Service installiert und dieser sorgt für den Start eines WCF Service
  • Singleton Pattern: MyCsharpAnwendung.GetInstance()

in beiden Fällen weiß ich aber nicht wie ich vom COM Objekt aus eine Verbindung zu der Managed Anwendung/Service aufbau und diesen anspriche.

Habt Ihr da eine Idee???

besten Dank antoschka

Erstellt vor 16 Jahren

So gesehen 100% d'accord.

Sagen wir also: beide Patterns ermöglichen die Auswahl unterschiedlicher Logik ....

Beste Dank noch einmal

antoschka

Erstellt vor 16 Jahren

Ok, ich glaube ich habe es verstanden.

Geholfen hat mit die englische Version des Wikipedia-Artikels zum Bridge-Pattern gelesen habe ( Bridge Pattern).
Im dortigen Code-Beispiel stand der erhellende Code-Kommentar:
"low-level" bzw. "high-level"

@LaTino:

Bridge ist NICHT dafür da, dein gewünschtes Verhalten zu implementieren, sondern hilft dir, deine Klassen zu organisieren.

Aus meiner Sicht doch beides oder.

  • Die Klassen zu organisieren durch die Implementierung der Abstraktion (o.g. Bsp.: high-level)
  • das gewünschtes Verhalten zu implementieren durch das Stratgie-Patternkonstrukt innerhalb des bridge-Patterns (o.g. Bsp.: low-level)

Besten Dank für Eure Hilfe und Euer Feedback - hat mir wirklich sehr geholfen!!!

antoschka

Erstellt vor 16 Jahren

Ja, das habe ich auch schon probiert. Mein Problem ist folgendes. Das spezifische Control ist eine DateEdit aus einer Controlsbibliothek und während der Eingabe ist immer der ganze Block (Tag, Monat oder JAhr) ausgewählt, somit ist SelectionStart immer 0 egal an welcher Stelle sich der Eingabe Cursor befindet. Anforderung ist dass eine Eingabe ohne den Separatoen möglich sein muss (Bsp: 010109). Mein Intension war nun, dass wenn der Cursor an erste Stelle steht und die zweite Ziffer eingetragen wird der Cursor dann vom Tag Block auf Monatsblock springt (dito mit Monat zu Jahr). Der Monat beginnt tatsächlich bei SelectionStart = 2, nur dass ich leider nicht weiß wann der Cursor am Ende des Tagesblockes angekommen ist (bei Eingabe des Tages ist SelectionStart immer 0 da der Block immer markiert ist).

Muss mir wohl eine andere Möglichkeit suchen das Problem anzugehen. Dennoch finde ich es merkwürdig, dass man an diese Info so schwer (evtl. gar nicht) heran kommt. Zwischen SelectionStart und der Cursor Position kann aus unterschiedlichsten Gründen ein Unterschied bestehen.

Auf jeden Fall besten Dank für Eure Hilfe antoschka

Erstellt vor 16 Jahren

Hallo,

ich habe ein Object-Instanz und würde diese in ein typesafe instanz einer meiner Klassen überführen. So eine Art TryParse ...

Das Problem tritt auf, weil ich eine Klasse erweitert habe und in einem Event nur die Superklasse erhalte. Ich weiß aber sicher, dass an dieser Stelle meine abgeleitet Klasse kommt und würde somit gern eine typesafe Instanz meiner eigenen Klasse erhalten.

Wie kann an das am Besten machen.
gibt es eine Möglichkeit mit Reflection o.ä.

Erstellt vor 16 Jahren

den artikel habe ich auch gelesen. Da geht es aber um den Maus cursor.

Ich meinen eine z.B. Textfeld, in dem der Eingabecursor blinkt. Wenn an einer bestimmte Stelle eine Eingabe gemacht ist möchte ich den Eingabe Cursor woanders hin bewegen.

Besten Dank fürs Feedback

antoschka