Einer Instanz etwas "anhängen" ?



  • namespace Game
    {
        class ResourceHolder<ResourceT> 
    
        {
            public List<ResourceT> mResourceMap;
    
            public ResourceHolder()
            {
                mResourceMap = new List<ResourceT>();
            }
    
            public void Load(string filename)
            {
                try
                {
                    var resource = (ResourceT)Activator.CreateInstance(typeof(ResourceT), new object[] {filename});
                    mResourceMap.Add(resource);
                }
                catch (Exception e)
                {
                    MessageBox.Show("Datei: " + filename + " konnte nicht gefunden werden.");
                }
            }
    
            public ResourceT Get(EnumResource id)
            {
                //Console.WriteLine(mResourceMap[0]);
                //return mResourceMap[0];
                return mResourceMap.Find(item => item.ID == id);
            }
        }
    }
    

    Bitte wendet euren Blick auf Zeile 30.

    EDIT Komplette Neuformulierung:
    Ich habe jetzt langsam herausbekommen welchen Problemfall ich hier zu lösen versuche, somit mach ich es kürzer.
    Ich würde gerne der Klasse ResourceT welche eine der Resource Klassen einer API ist die ich nutze (darunter SoundBuffer, Fonts, Texture...) eine Property anheften ohne die Klassedefinition im Ursprung zu ändern oder eine Vererbung mit einer eigenen Klassen zu tätigen.
    Im Endeffekt möchte ich einfach einer Instanz einer Klasse, "nachträglich" eine Property anheften - das Ganze nicht dynamisch/während der Runtime, sondern einfach nachträglich im Code selber.

    Googled:

    var withAddedProperty = new { Name = oldObject.Name, NewProperty = newValue };
    

    Ist einer der Lösungen die ich gefunden habe - jedoch kann ich diese nicht richtig anwenden, da ich sie nicht vollständig verstehe.

    Danke für Eure Hilfe im Voraus!

    gruß Charlie



  • Hallo,

    ausgehend von der Bemerkung von hustbaer in deinem anderen Beitrag frage ich mich jetzt auch, ob deine Klasse wirklich gut 'designed' ist.

    Aber als konkrete Antwort:
    Nein, du kannst nicht einfach einer Klasse oder Struktur eine Eigenschaft hinzufügen.
    Du müsstest also eine Wrapper-Klasse basteln (wie es auch der 'withAddedProperty'-Code macht, allerdings als anonyme Klasse).



  • Heya!

    Nunja gut designed bezweifel ich erstmal. Ich möchte darauf hinweisen, dass ich dem SFML API Tutorial folge welches in C++ geschrieben ist. Das Resource Management Design ist dort halt so angegeben bzw. ähnlich - ich versuche halt viele Dinge in C# umzusetzen wie es meine Amateur Erfahrung zulässt. Jedoch wird in diesem Buch das ResourceHolding eigentlich so erklärt wie ich es mit den Generics/Templates momentan auch bastel.
    Aber ich lerne ja noch - DesignFehler sind bitte zu verzeihen. Kritik wird aber dankbar entgegen genommen!

    Zu der Lösung des Problems:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using SFML.Graphics;
    using SFML.System;
    using SFML.Window;
    using SFML.Audio;
    using SFML;
    using MB.Tools;
    
    namespace Game
    {
        class ResourceHolder<ResourceT> 
    
        {
            public List<ResourceT> mResourceMap;
    
            public ResourceHolder()
            {
                mResourceMap = new List<ResourceT>();
            }
    
            public void Load(string filename)
            {
                try
                {
                    var resource = (ResourceT)Activator.CreateInstance(typeof(ResourceT), new object[] {filename});
                    resource.SetMetaProperty("ID", 1);
                    mResourceMap.Add(resource);
                }
                catch (Exception e)
                {
                    MessageBox.Show("Datei: " + filename + " konnte nicht gefunden werden.");
                }
            }
    
            public ResourceT Get(int id)
            {
                return mResourceMap.Find(item => (int)item.GetMetaProperty("ID") == id);
            }
        }
    }
    

    Ich habe durch Google eine MetaPropertyExtender Klasse gefunden (http://www.codeproject.com/Articles/386911/Csharp-Easy-Extension-Properties)

    Und diese im Code direkt erfolgreich benutzt und es klappt genau wie ich es erhofft habe (zwar bisher nur mit nem Integer aber den Rest probier ich gleich mal aus).

    Insofern ich aber auch euren Ratschläge sehr gerne folge - würde ich darum bitten mir einen Deutschuss zu den Wrappern Klassen im Bezug zu der Problemstellung zu geben. Habe darüber gelesen jedoch nur im Zusammenhang mit Portierung von C++ Code zu C# etc. Nicht wirklich auf das "Property Extending" Prinzip einer bestehenden Objektinstanz. Da würde ich gerne mehr erfahren!

    Gruß Charlie



  • Wir können dir nicht helfen so lange wir nicht wissen wozu du einem bestehenden Objekt eine Property anhängen willst.


Log in to reply