Laden...
W
Benutzerbeschreibung

Forenbeiträge von webbi Ingesamt 201 Beiträge

09.09.2008 - 02:17 Uhr

Und nochmal die Idee zu Assemblies: aus zwei mach eins...?
Sollte doch gehen, oder?

09.09.2008 - 02:12 Uhr

Dank, aber ITypeDescriptionProvider find ich gar nicht...? (Forum, msdn, ...)

Was soll damit möglich sein?
Wozu Databinding?

lg

09.09.2008 - 01:50 Uhr

Hi!

und damit das Beispiel vollständig ist hier noch der Weg zurück wer's braucht...


  ...
  index++;
  meinEnum eNew =  (meinEnum)Enum.ToObject(typeof(meinEnum), index);

lg

09.09.2008 - 00:57 Uhr

Hi!

sonst könnte ja jeder was dazu binden

Der Sinn der Sache 🙂

Wohe soll mein Programm wissen, dass in einer - eventuell - vorhandenen Plugin-Dll gerade noch genau die vermisste Methode zu finden ist?

Ich würde das meinem Programm ja gerne auch manuell mitteilen 🙂
Da ich die Plugin-Dll ja zur Laufzeit erstelle wäre das das kleinere Problem wenn es einen Weg gäbe…

Was hast Du eigentlich vor!?

das Gesamte System zur Laufzeit erweitern 🙂

Ich programmiere ein Delphi-Projekt in C# neu und gleichzeitig wird auf OODB (FastObjects) umgestellt...

Da das Gesamte System in DB-Schema, Funktionalität und GUI kundenspezifisch erweiterbar ist und alle “Standard“-Funktionen erweiter- bzw- änderbar sind muss das auch mit dem Klassenbaum möglich sein der die DB darstellt… 🙂

Ich muss also wirklich Klassen zur Laufzeit mit Felder, Properties, Funktionen und Constrtoren erweitern können…

Lustig, gell…

09.09.2008 - 00:07 Uhr

Hallo!

Habe mal wieder ein lustiges Problem:

Assembly1 wird in VS erstellt. Einhalten sind einige Klassen.

Assembly2 wird nach Programmstart vom der Applikation selber erstellt und darin sollten die Klassen aus Assembly1 erweitert werden.

Soweit ich das gesehen habe geht das ja nicht, weil ich mit partial eine Klasse nur auf mehrere cs-Files und nicht auf mehrere Assemblies aufteilen kann.

Da ich keine Infos gefunden habe ob sich da NET3.5 was geändert hat hoffe ich einfach mal... 🙂

Die andere Möglichkeit die ich mir überlegt habe wäre die beiden Assemblies in eines zusammen zu linken bevor es geladen wird ? 🙂 ? 😦
Geht das zur Laufzeit bzw. wie?

Dank

lg

07.07.2008 - 20:41 Uhr

Auch einen localen Sysadmin kannst Du aussperren.

Liegen die Binärdaten wie besprochen im Filesystem kann sich lokaler Administrator NTFS-Berechtigungen machen wie er will...?
Daten in der DB nicht, ok.

Du musst dir nur ein eigenes Certificat erzeugen und darüber kannst Du dann
wirklich verhindern, das ein localer admin die Daten anfassen kann

Das Certificat hängt dann aber direkt in der DB und nicht am Server, oder?
Sonnst könnt ich ja die DB an einem Anderen Server starten und geht wieder...

Sicher, dass es kein KEINE Möglichkeiten gibt?

lg

07.07.2008 - 20:04 Uhr

Hallo Leute!

außerdem gilt immer und überall (egal weches os). wenn jamand physikalisch zum rechner kommt, dann kann er auch machen was er will. löschen steht da ganz oben auf der liste der möglichen dinge.

Schon klar, nur ist es rein rechtlich 'schlimmer' es verschindet unprotolliert (außerhalb der appl.) eine Binärdatei - höchstwarscheinlich noch unbemekrt - als jemald löscht die ganze DB...
Kling komisch, ist aber so.

Wir nutzen SQL Server 2005, und da es da noch keinen FILESTREAM-Datentyp gab haben wir uns damals dafür entschieden die Dateien in der Datenbank abzulegen...

Wie gesagt, ich habe es zuletzt mit SQL 2K getestet und war das ein Horror...
Freut mich aber, dass sich hier anscheinen einiges getan hat - da ich leider noch bis DO bei einem Kunden bin komme ich nicht so schnell zum testen.

Noch eine Frage zum Tema ORMapper:
Bei abgeleiteten Klassen wird es eine Tabelle mit der Grundklasse und eine 1:1 verknüpfte Tabelle mit den Erweiterungen der Klindklasse werden, seh ich das richtig? Anders geht’s ja sinvoll garnicht…?

@ Khalid
Freu mich schon auf deine Testergebnisse! Wenn meine auch gut (für MSSQL) ausfallen wird ich mich in den nächsten Wochen mal mit ORMappern beschäftigen. Ziehe grade die SQL2k8 Beta…

Mal schauen…

Aus dem Tema ist jetzt zwar nicht das geworden, was mir vorgestellt habe, aber auf dejen Fall eine interessante Diskussion😉
Dank an alle!

lg

06.07.2008 - 14:09 Uhr

Hallo regen!

Ein Benchmark kann nur den deinen konkreten Anwendungsfall aussagekräftig sein.

Schon klar, aber ich werde trotzdem mal versuchen allgemeine aber dennoch aussagekräftige Ergebnisse zu bekommen.

Die Dateien der Datenbank liegen auch im Dateisystem, was ist der Unterschied zu anderen Dateien?

Es darf nicht möglich sein Binärdaten außerhalb der Applikation zu löschen - Auch nicht von lokalen Sysadmins - Das ich auch noch eine Punkt der gegen MS-SQL spricht - Ich kann einen 'externen' Zugriff nicht 100% verhindern - Ein lokaler Sysadmin kann sich immer Rechte geben…
Das gleiche gilt natürlich auch für alle Daten der DB.

Ich weiß, es sind spezielle Anforderungen 🙂

lg

06.07.2008 - 12:47 Uhr

Hi!

Also, im SQL 2008 kommt ein neuer Datentyp hinzu, der sich FILESTREAM nennt. Dieser legt die binären Daten direkt in das Dateisystem ab

Kling ja schon toll! Hast du auch Infos ob die Daten dann 1:1 im Filesystem liegen - Also lesbar - Das darf in meinem Fall nämlich nicht so sein...

Vorausgesetzt auch hier natürlich immer gute Hardware.

Meine Test damals liefen auf einem 4*2.8GHz XEON mit 32 GB RAM und 15K Raid 5 SCSI als Daten-Speicher. - Im Anhang ein cooler Screen-Shot dazu...
Das war also nicht das Problem...

Werd mal schauen, dass ich die Woche noch mal einen aussagekräftigeren Benchmark zusammen bekomme...

lg

06.07.2008 - 09:59 Uhr

Funktioniert‘s im Emulator?
bzw. schon mal versuch am PPC das Programm laufen zu lassen und am PC zu debuggen? Das ist ein cooles Feature von MS.

lg

06.07.2008 - 00:40 Uhr

Hallo JAck30lena!

Wollte ja nur sagen, dass mir ein ormapper Arbeit abnimmt die ICH nicht habe...
Erledigt.

Wie sieh's denn mittlerweile mit Binärdaten in SQL aus?
Hat das mal wer in aktuallen Versionen getestet?

lg

05.07.2008 - 23:43 Uhr

Hi!

Der Preis € 15.000 per Core oder so ist schon noch aktuell - Gilt aber nicht, wenn man FastObjets mit Applikation verkauft => OEM Vertrag nennen die sowas und Versant bekommt einen kleinen Anteil des Lizenzpreises... Dann kostet eben einen nur Bruchteil…

Dann hast du aber auch ein vom "normalen" Anwender komplett abweichendes Bedürfniss.

Das höre ich öfter 🙂

Was macht Ihr denn?

Document, Content & Communication Management
Mail, Fax, SMS, CTI, usw… Der Rest der Applikation ist wie gesagt Kunden/ Branchenspezifisch

Und komischerweise macht der Author genau das bei den OODB's, absicht?

??? Geht in FO standardmäßig nicht anders… Der Autor hat sich in beide Systeme nicht sehr weit eingearbeitet…
Ich Arbeite mit FO aber auch mit einer Transaktion je Objekt (geht bei meinen Bedürfnissen nicht anders) und hier ist der Geschwindigkeitsunterschied recht gering – Daher kann ich den Beitrag doch als Referenz nutzen 😉

Und ORMapper ( vernünftige ) sind heute weder langsam, noch unhandlich, nehmen
dir aber viel arbeit ab.

Arbeit die ich bei OODB nicht habe… 😉

lg

05.07.2008 - 21:47 Uhr

Hallo FZelle!

Habe das zwar mit MS-SQL 2K zuletzt getestet aber da lagen bei Binärdaten Welten zwischen SQL und FO - Performance-Technisch.

Mit MS-SQL und MySql hatten wir einen gewaltigen Performanceeinbruch sobald die gesamte DB nicht mehr in den RAM passte.
Wir haben mal ne Weile getestet – 25 GB Datenbank, 32GB RAM und diverse SQL-Server.

Und noch ein Link zum Tema

Zum ORMapper – Alles schön und gut, aber ich verzichte gerne auf jede unnötige Schnittstelle zwischen Applikation und DB…

Und ganz nebenbei ist FO günstiger als z.B. MS SQL Standard…

Lg

//Edit: Titel entfernt - Der kam da irgendwie rein...

05.07.2008 - 21:27 Uhr

@FZelle
? SQL Compact ist die Mini-Version für PPC und WinMobile...?
Runtime am Client ist ja die selbe...?

lg

05.07.2008 - 18:29 Uhr

Hi!

Habe sowas nur mal mit SQL CompactEdition - also DB am PPC - gemacht...
Fehlermeldung?
Runtime am PPC installiert?

lg

05.07.2008 - 17:55 Uhr

Hi!

Doch noch einer da 😉
Mit DB4O hab ich mich auf mal beschäftig und mich dann aus eben diesen genannten Gründen für FastObjets entschieden.

Für mich waren noch drei Punkte ausschlaggebend:*Binärdaten in der DB – Mit SQL und CO braucht man das ja nicht zu probieren *Datenbankgrößen von mehreren 100GB sind normal, 4TB hat meine Test-DB zurzeit… *Anpassungsfähigkeit – Die Applikation sollte in DB und GUI Kundenspezifisch 100% veränderbar sein und das ist einfacher und schneller wenn sich die DB der Applikation anpasst und nicht umgekehrt…

lg

05.07.2008 - 01:04 Uhr

???
Bei 10 und 12 ist das so... 11 hab ich grad nicht da...
Such doch einfach mal die Registry nach einem PST-File durch...

lg

//edit: Erst jetzt das Datum gesehen.. Wird wohl keinen mehr interessieren...

05.07.2008 - 00:45 Uhr

Hallo!

Damit es noch ein Möglichkeit mehr gibt ohne dir wirklich zu helfen 😉:
Schau dir da mal den letzten Beitrag an. Wenn du solche Listen öfter in der Applikation verwenden willst und noch dazu immer die gleichen Events haben willst wühl dich da mal durch.
So ähnlich mach ich es mit einer recht aufwendigen Klassenstruktur…
Und in 2.0 tendiere ich auch eher zu List<T> - Ist schnell und wird all deine Anforderungen abdecken.
lg

05.07.2008 - 00:31 Uhr

Hallo!

Noch nie versucht, aber hier hab ich das mal gefunden...

lg

05.07.2008 - 00:27 Uhr

Hallo!

Bitte mir jetzt nicht alles durchgelesen, aber ich denke das könnte dir helfen: DevExpress

lg

05.07.2008 - 00:22 Uhr

Hallo!

Schon mal .Name gefunden?

und hier mal lesen - Im Punk1 stehen drei wichtige Links...

lg

05.07.2008 - 00:18 Uhr

Hallo!

Möglichkeiten gibt’s da 54558 – mindestens… 😉

Mit Panels geht’s recht einfach – du musst das ‘Button-Panel‘ dann halt unsichtbar schalten.

Soll’s denn auch einen Weg zurück geben?
Wenn es mehrere Fenster geben soll, aber immer nur eines angezeigt schau dir mal MDI an.

TabPage und Titel ausblenden…
UserControl - Wären noch etwas saubere als Panels…
Eigene Forms und immer nur eine sichtbar schalten…
u.s.w.

Wie gesagt – je nachdem was du denn genau machen willst und was alles möglich sein soll.

und meinst du genau mit überschreiben?

lg

05.07.2008 - 00:09 Uhr

Hallo!

Ich verwende bei sowas keine bs dazwischen aber kann trotzdem ja mal ein bisschen wichtig reden... 😉

  1. Wie post ich richtig? Punkt 5 => Die Fehlermeldung wäre sinnvoll...

  2. Ohne Employer Property geht ALLES? Gibt's noch mehr Properties? Poste doch mal einen Teil deiner Klasse… Was VS wohl auch beim verwenden einer BindingSource braucht ist ein Constuctor ohne Parameter in deiner Klasse der funktionieren sollte…

..eine neue BindingSource (mit Eigener DatenTyp) erstellen will bekomme ich ne fehlermeldung und er machts nichts (ausser die bs anlegen)

Blöde Frage, aber was soll er denn noch machen? - Wie gesagt - hab noch nie eine bs verwendet...

lg

04.07.2008 - 23:54 Uhr

Hallo!

Ich musste mich dank OODB in C# ja noch nie mit SQL beschäftigen, gehe aber mal davon aus, dass das auch richtig ist so.
Du muss einerseits die Links löschen und andereseits die Datensätze...
Behaupte ich jetzt mal...

lg

04.07.2008 - 19:01 Uhr

verwendetes Datenbanksystem: Versant FastObjects.NET

Hallo ihr da draußen!
Ich arbeite seit einiger Zeit mit FastObjects.NET (früher mal als Poet bekannt). Habe mal lange gesucht und mir 5-6 OODB’s angeschaut und bin immer noch der Meinung die richtige Wahl getroffen zu haben.
Die .NET Runtime ist die nicht die, die es in C++ war, aber sie entwickelt sich fleißig weiter…
Nun wollte ich mal fragen wie das bei euch so aussieht.
Ich weiß ja, dass es nicht viele geben wird, die sich damit beschäftigen aber von denjenigen würd ich mich über eine Antwort freuen womit sie arbeiten und wie glücklich…

lg

04.07.2008 - 17:55 Uhr

Hallo!

Wenn du eh DevExpress hast ist das ja ein dreizeiler...
Schau dir mal die DevExpress-Demo dazu an...
Dann hast schon mail ein PDF und wie du ein Mail draus machst findest im Forum oft genug...

lg

04.07.2008 - 16:38 Uhr

Hallo!

Bei Notebooks ist die FN-Taste ja bekannt. Mein Problem ist, dass beim Logitech Wave Keyboard die 'Rechte Maustaste' durch eben diesen sinnlosen ersetzt wurde.
Nun dachte ich mir ich überwache global die Tasten und wenn FN allein gedrückt wird simuliere ich Key 93 (sollte das sein) …
Leider scheint man bei FN allein kein Event zu bekommen – Hab’s jetzt einfach mal ganz simpel mit einer Win-Form und KeyDown probiert…

lg

04.07.2008 - 14:52 Uhr

Hallo!

Ich würde gerne Kassenbäume aus meinen Projekten visuell darstellen können - so ähnlich wie z.B. Datenbankdiagramme in MSSQL oder so.
Also alle klassen, und Beziegungen - Wäre grade bei einem DB-Schema angenem...
Sind da Tools bekannt bzw. wo find ich welche?

Danke

04.07.2008 - 13:57 Uhr

jaja... Wer lesen kann ist klar im Vorteil...
Event passt, aber Console.WriteLine() macht nix - aber nicht, dass es wichtig wäre...

Danke

04.07.2008 - 13:05 Uhr

???
Doch nicht...


 _applicationObject.Events.SelectionEvents.OnChange += new _dispSelectionEvents_OnChangeEventHandler(SelectionEvents_OnChange);

 public void SelectionEvents_OnChange()
 {
     Console.WriteLine("**********CHANGE SELECTION"); 
 }

Jetzt wieder nicht????
Das ganze gin einmal, ohne Änderung neu gestartet und geht nicht mehr???
Hat sich schon mal wer damit beschäftigt?

lg

04.07.2008 - 12:54 Uhr

Sorry, _applicationObject.Events.SelectionEvents.OnChange greift eh. Zwar nicht immer wenn ich es will, aber schonmal beim wechseln der Form...

lg

04.07.2008 - 12:40 Uhr

Hallo Leute!

Ich bastle grade an einem VS AddIn und suche verzweifelt nach einem Event das beim selektieren im Designer greift.
Sollte doch in _applicationObject.Events irgendwo zu finden sein, oder?

Und bevor ich jetzt 5 mal ein 'ja' zurück bekomme noch die Frage:
Wenn dann wo? 🙂

lg

04.07.2008 - 12:31 Uhr

Wenn ich mal kurz was zusammenfassen darf:

Wenn ich nicht mehr als 7 Nachkommastellen benötige ist float sinvoller...?
Ich weiß dass wir solche Probleme mit SQL- und DBase-DB's mal hatten, hab mich aber nich wirklich damit beschäftigen müssen.

lg

04.07.2008 - 12:07 Uhr

Danke, aber ich will den 'externen' Source ja eben nicht debuggen, sonden nur einfach dorthin springen können...

lg

04.07.2008 - 11:55 Uhr

Das sind eben die 'verwöhnten Delphi-Entwickler'….
Es geht ja nicht nur um .NET Source selber, sondern auch um andere Assemblys die ich in Projekten verwende, von dehnen ich aber den Source habe…
Bin’s von Delphi halt gewohnt und das ist eben eine sehr bequeme Funktion.
War hier von VS 2008 recht enttäuscht, da sich an der Oberfläche bzw. der Benutzerfreundlichkeit für die Entwickler nicht viel getan hat...

lg

04.07.2008 - 11:45 Uhr

Hi herbi!

Danke, aber soweit ich das sehe nicht so ganz wich ich mir das vorstelle.
Und noch eine externe Komponente in die Applikation einbinden wollte ich auch nicht...
Aber gut, ich mach's manuel....

Danke

03.07.2008 - 21:49 Uhr

Hallo!

Ich weiß, es ist nicht erwünscht, aber ich riskiere es jetzt einfach mal.
Habe mich nämlich immer mal wieder blöd gesucht wegen dem Thema, aber leider nie wirklich was Hilfreiches gefunden.
Vielleich hat da doch noch jemand eine Idee wenn der Beitrag nochmal aufcheint.

Danke

03.07.2008 - 21:41 Uhr

Gegenfrage am Rande:

float f = 999.01F;
//f = 999.01001
double d = (double)f;
//d = 999.010009765625

Warum eigentlich?

03.07.2008 - 10:14 Uhr

Hallo!

Für EnumChildWindows brauch ich ja wieder das MainWindowHandle und die abfrage dauert gleich lang wie MainWindowTitle...

lg

03.07.2008 - 00:58 Uhr

Hallo!

Ich bräuchte alle aktuell sichtbaren Fenster.


foreach (Process proc in Process.GetProcesses())
{
   string title = proc.MainWindowTitle;
   if (!string.IsNullOrEmpty(title))
   {
       //Prozess hat ein Fenster und ist offen
   }
 }


Das dauert aber bei 10 geöffneten Applikationen ~200ms

Und das ist die MainWindowTitle-Abfrage - ohne die läuft die schleife in 1-2ms durch...

Ich verstehe ja, dass Windows ja ein bisschen suchen muss und so, aber es gibt doch sicher eine einfachere Lösung, oder?

lg

02.07.2008 - 17:59 Uhr

Hallo Leute!

Ich arbeite am Notebook mit VS2008 => .NET 3.5
Dann hab ich mit NetMassDownloader den 3.5 Source geladen und in der Config vom VS und der Projektmappe die Pfade entsprechend angelegt.
Dann soll ja, soweit ich das verstanden habe, debuggen durch den .NET Source gehen.
Was ich mir jetzt aber noch wünsche ist mit F12 – Gehe zu Definition – auch zum entsprechenden Source zu springen anstatt, dass die Seite ‘xxx [aus Metadaten]‘ aufgeht…
Wenn möglich, wie?

Danke

01.07.2008 - 00:31 Uhr

Hallo!

Habe jetzt doch noch etwas getippt... - Viel mehr war's ja nicht...
So oder ähnlich hab ich mir das vorgestellt...
Habe das jetzt nur getippt und compilen geht - NIE GETESTET!
Warum ich ICollection implementiere kann ich grad nicht sagen - Hab mir aber sicher was dabei gedacht.
Funzen soll das ganze dann mal mit IList<>, IList, ICollection<>, ICollection und IEnumerable als Source...
Könnte eine recht sinvolle Klasse werden... Zumindest für mich 🙂

Außerdem möchte ich ja innerhalb meiner Applikation immer denselben Listen-Typ verwenden

Darum: myList() : this(new List<T>())

Mit einer ICollection<> geht's sicher nicht - da wird in der sType.IsGenericType-Schleife sicher Kacke gebaut...
So, aber ich mag nicht mehr...
Werde heute nicht mehr dazu kommen noch was dran zu basteln, aber schon mal wer testen will - Viel Spass.


using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;

namespace ListTest
{
    class myList<T> : IList<T>, IList, ICollection
    {
        private object _Source = null;
        private Type _ItemType = null;
        private bool _IsICollection = false;
        private bool _IsIList = false;
        private bool _IsGenericIList = false;

        public myList()
            : this(new List<T>())
        {

        }

        public myList(object Source)
        {
            if (Source == null)
            {
            	throw new ArgumentNullException("Source", "Darf nicht null sein");
            }

            this._Source = Source;

            Type sType = this._Source.GetType();
            if (this._Source is ICollection)
            {
                this._IsICollection = true;
            }
            if (this._Source is IList)
            {
                this._IsIList = true;
            }
            if (sType.IsGenericType)
            {
                this._IsGenericIList = true;
                Type lType = typeof(IList<>).MakeGenericType(sType.GetGenericArguments()[(int)decimal.Zero]);
                if (lType.IsAssignableFrom(sType))
                {
                    Type itype = this._Source.GetType().GetGenericArguments()[(int)decimal.Zero];
                    this._ItemType = itype;
                }
                else
                {
                    throw new Exception("Was ist jetzt schief gelaufen?");
                }
            }
        }

        // von IList<T>
        public T this[int index] 
        {
            get
            {
                if (this._IsGenericIList)
                    return (this._Source as IList<T>)[index];
                throw new System.NotSupportedException();
            }
            set
            {
                if (this._IsGenericIList)
                {
                    (this._Source as IList<T>)[index] = value;
                    return;
                }
                throw new System.NotSupportedException();
            }
        }

        public int IndexOf(T item)
        {
            if (this._IsGenericIList)
                return (this._Source as IList<T>).IndexOf(item);
            if (this._IsIList)
                return (this._Source as IList).IndexOf(item);
            throw new System.NotSupportedException();
        }

        public void Insert(int index, T item)
        {
            if (this._IsGenericIList)
            {
                (this._Source as IList<T>).Insert(index, item);
                return;
            }
            if (this._IsIList)
            {
                (this._Source as IList).Insert(index, item);
                return;
            }
            throw new System.NotSupportedException();
        }

        public void RemoveAt(int index)
        {
            if (this._IsGenericIList)
            {
                (this._Source as IList<T>).RemoveAt(index);
                return;
            }
            if (this._IsIList)
            {
                (this._Source as IList).RemoveAt(index);
                return;
            }
            throw new System.NotSupportedException();
        }

        //Von ICollection<T>
        public int Count 
        {
            get
            {
                if (this._IsGenericIList)
                    return (this._Source as IList<T>).Count;
                if (this._IsIList)
                    return (this._Source as IList).Count;
                if (this._IsICollection)
                    return (this._Source as ICollection).Count;
                throw new System.NotSupportedException();
            }
        }

        public bool IsReadOnly 
        {
            get
            {
                if (this._IsGenericIList)
                    return (this._Source as IList<T>).IsReadOnly;
                if (this._IsIList)
                    return (this._Source as IList).IsReadOnly;
                throw new System.NotSupportedException();
            }
        }

        public void Add(T item)
        {
            if (this._IsGenericIList)
            {
                (this._Source as IList<T>).Add(item);
                return;
            }
            if (this._IsIList)
            {
                (this._Source as IList).Add(item);
                return;
            }
            throw new System.NotSupportedException();
        }

        public void Clear()
        {
            if (this._IsGenericIList)
            {
                (this._Source as IList<T>).Clear();
                return;
            }
            if (this._IsIList)
            {
                (this._Source as IList).Clear();
                return;
            }
            throw new System.NotSupportedException();
        }

        public bool Contains(T item)
        {
            if (this._IsGenericIList)
                return (this._Source as IList<T>).Contains(item);
            if (this._IsIList)
                return (this._Source as IList).Contains(item);
            throw new System.NotSupportedException();
        }

        public void CopyTo(T[] array, int arrayIndex)
        {
            if (this._IsGenericIList)
            {
                (this._Source as IList<T>).CopyTo(array, arrayIndex);
                return;
            }
            if (this._IsIList)
            {
                (this._Source as IList).CopyTo(array, arrayIndex);
                return;
            }
            if (this._IsICollection)
            {
                (this._Source as ICollection).CopyTo(array, arrayIndex);
                return;
            }
            throw new System.NotSupportedException();
        }

        public bool Remove(T item)
        {
            if (this._IsGenericIList)
                return (this._Source as IList<T>).Remove(item);
            if (this._IsIList)
                try
                {
                    (this._Source as IList).Remove(item);
                    return true;
                }
                catch
                {
                    return false;
                }
            throw new System.NotSupportedException();
        }

        //Von IEnumerator<>
        public IEnumerator<T> GetEnumerator()
        {
            if (this._IsGenericIList)
                return (this._Source as IList<T>).GetEnumerator();
            throw new System.NotSupportedException();
        }

        //Von IList
        public bool IsFixedSize
        {
            get
            {
                if (this._IsGenericIList)
                    return false;
                if (this._IsIList)
                    return (this._Source as IList).IsFixedSize;
                throw new System.NotSupportedException();
            }
        }
        //bool IsReadOnly { get; }              //Gibt's ja schon 
        object IList.this[int index]
        {
            get
            {
                if (this._IsGenericIList)
                    return (this._Source as IList<T>)[index];
                if (this._IsIList)
                    return (this._Source as IList)[index];
                throw new System.NotSupportedException();
            }
            set
            {
                if (this._IsIList)
                    (this._Source as IList)[index] = value;
                throw new System.NotSupportedException();
            }
        }

        public int Add(object value)
        {
            if (this._IsIList)
                (this._Source as IList).Add(value);
            throw new System.NotSupportedException();
        }

        public bool Contains(object value)
        {
            if (this._IsIList)
                (this._Source as IList).Contains(value);
            throw new System.NotSupportedException();
        }

        public int IndexOf(object value)
        {
            if (this._IsIList)
                return (this._Source as IList).IndexOf(value);
            throw new System.NotSupportedException();
        }

        public void Insert(int index, object value)
        {
            if (this._IsIList)
                (this._Source as IList).Insert(index, value);
            throw new System.NotSupportedException();
        }

        public void Remove(object value)
        {
            if (this._IsIList)
            {
                (this._Source as IList).Remove(value);
                return;
            }
            throw new System.NotSupportedException();
        }
        //void RemoveAt(int index);             //Gibt's ja schon 

        //Von ICollection
        //int Count { get; }                    //Gibt's ja schon 
        public bool IsSynchronized
        {
            get
            {
                if (this._IsIList)
                    return true;        //???
                if (this._IsIList)
                    return (this._Source as IList).IsSynchronized;
                if (this._IsICollection)
                    return (this._Source as ICollection).IsSynchronized;
                throw new System.NotSupportedException();
            }
        }

        public object SyncRoot
        {
            get
            {
                if (this._IsIList)
                    return this._Source;
                if (this._IsIList)
                    return (this._Source as IList).SyncRoot;
                if (this._IsICollection)
                    return (this._Source as ICollection).SyncRoot;
                throw new System.NotSupportedException();
            }
        }

        public void CopyTo(Array array, int index)
        {
            if (this._IsIList)
            {
                (this._Source as IList).CopyTo(array, index);
                return;
            }
            if (this._IsICollection)
            {
                (this._Source as ICollection).CopyTo(array, index);
                return;
            }
            throw new System.NotSupportedException();
        }

        //Von IEnumerable
        IEnumerator IEnumerable.GetEnumerator()
        {
            if (this._Source is IEnumerable)
            {
                return (this._Source as IEnumerable).GetEnumerator();
            }
            throw new System.NotSupportedException();
        }

    }
}

//edit: ein kleiner Bug...

30.06.2008 - 22:01 Uhr

bzw. noch was:


public class Person
{
    ...
    private IList<Child> children;
    ...
    public IList<Child> Children
    {
        get
        {
            if (this.children == null)
            {
                this.children = new List<Child>();
                return this.children
            }
            else
            {
                return new List<Child>(this.children);
            }
        }
        set 
        {
            this.children = value;
        }
    }
}

Wenn ich jetzt z.B. Person.Children.Add() aufrufe wird aber schon get ausgefüht, oder?
Gibt es einen Fall außer Person.Children = xChilds wo set ausgeführt wird?

lg

30.06.2008 - 21:55 Uhr

Ich vermisse mein Delphi!
Da hatte man von allen System-Klassen den Source, konnte dran rumbasteln und musste keine so blöden Fragen stellen:

Habe das grade noch gefunden, aber ich gehe davon aus, dass wenn die kopieren hinschreiben auch kopieren meinen... 😦


public List(IEnumerable<T> collection);
//collection: Die Auflistung, deren Elemente in die neue Liste kopiert werden.

Aber gut... Wrapperliste ist in Arbeit...

lg

30.06.2008 - 18:59 Uhr

Ok, hab sie mir doch gleich angeschaut...
Und nach richtigem Durchlesen: Sorry, ist ja ganz einfach 🙂

Gut, dann hat der Thread wenigstens den Sinn, dass ein TypedIList2UntypedIListWrapper oder so dabei raus kommt.

Schaue, dass ich es die Woche noch schaffe und stelle mein Ergebnis dann Online...

Danke an alle

lg

//Edit: Jaja... Copy & Paste... Nach der Warp vs. Wrap Diskussion s.u. hab ich den Fehler natürlich auch ausgebessert.

30.06.2008 - 18:20 Uhr

Danke!

Hab die ReadOnlyBaseList ehrlich gesagt nur "überflogen", aber werd schauen, dass ich die Tage mal dazu komme.

Wasser zu Gold wäre trotzdem eine coole Funktion... Auch egal ob Wasser, Stroh oder sonst was… 🙂

lg

30.06.2008 - 17:16 Uhr

ReadOnlyBaseList kopiert ja auch nicht, sondern wrappt nur. Auch wenn du ReadOnlyBaseList nicht verwenden kannst, kannst du zumindest analog vorgehen.

Da das wirklich noch etwas positiv kling - Kannst du die Idee etwas beschreiben?
Stehe grad irgendwie an...

Danke

30.06.2008 - 17:13 Uhr

dann wirst du wohl eher aus wasser gold herstellen können als dieses problem zu lösen.

Das kann warscheinlich auch keiner, oder? Würde mehrere Probleme lösen...

30.06.2008 - 14:52 Uhr

Schau mal hier: Open Book C#
Zum einsteigen nicht schleicht...

lg

30.06.2008 - 14:05 Uhr

rtfm

myClass.xEvent += new EventHandler(myEvent);

lg