myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
   » Plugin für Firefox
   » Plugin für IE
   » Gadget für Windows
» Regeln
» Wie poste ich richtig?
» Datenschutzerklärung
» wbb-FAQ

Mitglieder
» Liste / Suche
» Stadt / Anleitung dazu
» Wer ist wo online?

Angebote
» ASP.NET Webspace
» Bücher
» Zeitschriften
   » dot.net magazin
» Accessoires

Ressourcen
» .NET-Glossar
» guide to C#
» openbook: Visual C#
» openbook: OO
» .NET BlogBook
» MSDN Webcasts
» Search.Net

Team
» Kontakt
» Übersicht
» Wir über uns
» Bankverbindung
» Impressum

» Unsere MiniCity
MiniCity
» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Basistechnologien und allgemeine .NET-Klassen » Dynamische Properties zur Laufzeit?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Dynamische Properties zur Laufzeit?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
roland roland ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-1538.jpg


Dabei seit: 28.06.2004
Beiträge: 257
Entwicklungsumgebung: Visual Studio 2003 Enterprise
Herkunft: Deutschland


roland ist offline

Dynamische Properties zur Laufzeit?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo c#pler,

ist es möglich einer Klasse zur Laufzeit neue Properties hinzuzufügen?

Es geht darum, das ein Benutzer zusätzliche Felder zu bestimmten Objekten konfigurieren kann.

Hierbei darf es sich nicht um eine Collection oder Array handeln, um zusätzliche Felder zu verwalten, sondern um echte Properties.

Wenn das geht wäre ich für eine Beschreibung der Lösung sehr dankbar.


Viele Grüße

roland
29.09.2005 08:51 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
dr4g0n76
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-1768.jpg


Dabei seit: 07.07.2005
Beiträge: 2.756
Entwicklungsumgebung: SharpDevelop/VS.NET
Herkunft: Deutschland


dr4g0n76 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Also eigentlich bleiben Dir dann nur zwei Möglichkeiten übrig, entweder doch eine ArrayList zu verwenden, oder das ganze per Reflection zu machen.

Hier ein Ansatz für eine Liste:

C#-Code:
    public class CONTROLSTATE
    {
        private string m_sControlState = null;

        public CONTROLSTATE(string sControlState)
        {
            m_sControlState = sControlState;
        }

        public CONTROLSTATE()
        {
        }

        public override string ToString()
        {
            return m_sControlState;
        }
    }


        private void AddProps(SortedList sl)
        {
            CONTROLSTATE[] ctrlStates = CONTROLSTATES.SINGLETON.STATES;
            for(int i=0;i<ctrlStates.GetLength(0);i++)
            {
                //sl.Add(ctrlStates[i],null);
                sl.Add(ctrlStates[i].ToString(),null);
            }
        }
29.09.2005 09:10 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
dr4g0n76
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-1768.jpg


Dabei seit: 07.07.2005
Beiträge: 2.756
Entwicklungsumgebung: SharpDevelop/VS.NET
Herkunft: Deutschland


dr4g0n76 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich rufe die Properties dann so auf:

C#-Code:
SkinnedControl ctrl = SkinControlsProxy.SKINCONTROLSPROXY.GetSkinnedControl(typeof(Form));

            CONTROLSTATE[] STATE = CONTROLSTATES.SINGLETON.STATES;
            /*for(int i=0;i<SkinControlsProxy.SKINCONTROLSPROXY.Count;i++)
            {
                //this part has to be changed in future because it is not runtime expendable!!!!
                //STATE[i]: this might be a string in ctrl.Properties, if Icomparer does cause an exception
                for(int j=0;j<CONTROLSTATES.SINGLETON.STATES.GetLength(0);i++)
                {
                    ctrl.Properties.SetBackgroundImage    (STATE[i],    (Image)m_slImgBackground[STATE[i]]);
                    ctrl.Properties.SetBackColor        (STATE[i],    (Color)m_slBackColor[STATE[i]]);
                    ctrl.Properties.SetForeColor        (STATE[i],    (Color)m_slForeColor[STATE[i]]);
                    ctrl.Properties.SetFont                (STATE[i],    (Font)m_slFont[STATE[i]]);
                    ctrl.Properties.SetImage            (STATE[i],    (Image)m_slImage[STATE[i]]);
                    ctrl.Properties.SetRegion            (STATE[i],    (Region)m_slRegion[STATE[i]]);
                }
            }*/
29.09.2005 09:14 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
dr4g0n76
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-1768.jpg


Dabei seit: 07.07.2005
Beiträge: 2.756
Entwicklungsumgebung: SharpDevelop/VS.NET
Herkunft: Deutschland


dr4g0n76 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Wie man sieht habe ich einige Properties mit Namen fest definiert, aber es besteht jederzeit die Möglichkeit feste neue Properties hinzuzufügen. Da diese vom Typ object sind, kann alles hinzugefügt werden.

Eventuell müßtest Du dir für jeden Typ, den Du zurückgeben willst, etwas basteln, damit nicht aus Versehen in eine Funktion die einen int zurückgeben soll, z.B. ein String-Object zurückgibt...
29.09.2005 09:29 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
roland roland ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-1538.jpg


Dabei seit: 28.06.2004
Beiträge: 257
Entwicklungsumgebung: Visual Studio 2003 Enterprise
Herkunft: Deutschland

Themenstarter Thema begonnen von roland

roland ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Vielen Dank für deine Hilfe!

Doch benötige ich leider echte Properties, da ich die Properties z. B. mit Controls per DataBinding verknüpfen muss.

Kennt jemand einen Weg über Reflection?


Viele Grüße

roland
29.09.2005 10:12 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
norman_timo norman_timo ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-1775.jpeg


Dabei seit: 13.07.2004
Beiträge: 4.506
Entwicklungsumgebung: .NET 2.0/3.5 und VS2005/VS2008
Herkunft: Wald-Michelbach (Odw)


norman_timo ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo roland!

Zitat:
Kennt jemand einen Weg über Reflection?

Nach meinem bisherigen Verständnis über Reflection, ist das leider nicht möglich. Du kannst per reflection vorhandene Properties auslesen, aber keine neue hinzufügen.


Aber folgendes würde funktionieren (sehr umständlich):

- Schritt 1: Du erzeugst eine Klasse dynamisch mit dem Laufzeitkompiler
- Schritt 2: Du speicherst die IML-kompilierte Version Deiner Klasse in eine DLL
- Schritt 3: Du lädst diese Klasse über Assembly.Load()
- Schritt 4: Für das erzeugen neuer Properties schmeißt Du die geladene DLL aus dem GAC und wiederholst Schritt 1-3

Frag mich jetzt aber bitte nicht nach Sourcecode, das ist nämlich schon n bissl komplizierter, als grad mal so online neuer Code erstellt ;-)

Ciao
Norman-Timo
29.09.2005 11:09 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Programmierhans
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-1651.gif


Dabei seit: 05.04.2005
Beiträge: 4.200
Entwicklungsumgebung: VS / Mono (IOS/LINUX)
Herkunft: Zentralschweiz


Programmierhans ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Such mal nach ExtenderProvider / IExtenderProvider
29.09.2005 11:42 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
roland roland ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-1538.jpg


Dabei seit: 28.06.2004
Beiträge: 257
Entwicklungsumgebung: Visual Studio 2003 Enterprise
Herkunft: Deutschland

Themenstarter Thema begonnen von roland

roland ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich werde mich dann mal über die angegeben Quellen informieren.

Danke für eure Antworten!
30.09.2005 15:15 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MartinE MartinE ist männlich
myCSharp.de-Mitglied

Dabei seit: 09.04.2005
Beiträge: 49
Entwicklungsumgebung: Visual Studio 2005


MartinE ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Guten Tag.

Eine etwas abgefahrene Möglichkeit ist es den Code dynamisch zur Laufzeit zu generieren und anschließend zu instanzieren. Ein Ausgangspunkt für Informationen ist hier:

 http://msdn.microsoft.com/library/defaul...lelanguages.asp

Die Idee wäre es nun zur Laufzeit eine Klasse zu erstellen, die von der Klasse die erweitert werden soll erbt. Der Code wird dann intern compiliert und anschließend kann man ihn dann via Reflection instanzieren. ASP.NET nutzt diese Funktion recht intensiv.

Meines erachtens nach wäre es dennoch besser mit Collections/Generics bzw. Arrays zu arbeiten. Was Ihnen vorschwebt ist sicherlich sowas wie das Item/Fields Modell aus z.B. Sharepoint, Exchange oder anderen Messaging Anwendungen. Wenn Sie unbedingt Properties brauchen klingt das ein wenig nach Ärger mit DataBinding oder Ärger mit Webservices unter 1.x, die beide Properties brauchen. Aber zumindest für ersteres gibt es im System.ComponentModel Namespace eine ganze Reihe von Interfaces.

-Martin Ehrlich
01.10.2005 13:06 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
roland roland ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-1538.jpg


Dabei seit: 28.06.2004
Beiträge: 257
Entwicklungsumgebung: Visual Studio 2003 Enterprise
Herkunft: Deutschland

Themenstarter Thema begonnen von roland

roland ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Dieser Artikel klingt interessant, es ist eigentlich so ähnlich wie ich mir das vorgestellt hatte. Allerdinge glaube ich das hier Probleme mit der Performance auftauchen werden. Deshalb habe ich mich dazu entschieden doch lieber ArrayLists und Collections zu verwenden.
03.10.2005 22:48 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
cadi cadi ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-1786.jpg


Dabei seit: 03.06.2005
Beiträge: 308
Entwicklungsumgebung: VS.NET 2005
Herkunft: Hamburg


cadi ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo roland,

ich glaube nicht. das du Perfomance probleme bekommen würdest.
Da du dem User ja etwas präsentieren willst wirst du ja nicht hundertemale pro Sekunde Objekte dynamisch kreieren wollen.

Ich habe sehr gute Erfahrung damit gemacht. Allerdings gehe ich nicht den Weg über CodeDom sonder direkt über IL und Emit.
Damit spart man sich den Weg über den Kompiler und es wird auch nichts auf der Platte verarbeitet.

Es gibt auch Beispiele wo das dynamische erzeugen von Methoden schneller ist, als eine klassische ausführung (z.B. wenn man eine Rekursion linear abarbeitet)
04.10.2005 14:22 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 9 Jahre.
Der letzte Beitrag ist älter als 9 Jahre.
Antwort erstellen


© Copyright 2003-2014 myCSharp.de-Team. Alle Rechte vorbehalten. 24.11.2014 18:22