none
Typparameter anwenden, gescheitert? RRS feed

  • Frage

  •  public static T[] GetValues<T>(int Index, int folderIndex)
            {
                BinaryReader br = ...
        T typParameter; 
    Type typ=            typParameter.GetType();
                // init
                br.BaseStream.Seek(8, SeekOrigin.Begin);
                int Count = br.ReadInt32();
                //int[] Counts = new int[Count];
                T[] Counts = new T[Count];
                // StartIndex of first dataset
                br.BaseStream.Seek(headerBytesCount + ValueTypeIndex, SeekOrigin.Begin);
                       
                // read the Counts into Array
                for (int mr = 0; mr < Count; mr++)
                {
                    if(typ == typeof( Int32))
                    {
                          Counts[mr] =  (T)br.ReadInt32();
                    }
                    else if(typ == typeof(DateTime))
                    {
                        Counts[mr] = br.ReadInt64();
                    }
                   
                    br.BaseStream.Position += dataSetBytesCount - 4;
                }
                br.Close();
                return Counts;
            }

    Hallo,

    ich versuche hier gerade ein Programm zu schreiben, und glaube dass man das mit Typparameter lösen könnte, weiß aber nicht wie.

    Habe schon gegoogled, leider ohne Erfolg.


    MfG, Valentin D.



    PS: Ich möchte aus einer Datei einmal DateTime[] und einmal int[] auslesen.
    • Bearbeitet Valentin-D Dienstag, 7. August 2012 13:53
    Dienstag, 7. August 2012 13:40

Antworten

  • Hallo Valentin,

    Mit Generics wird das immer mühsam, da man am Ende doch auf spezifische Methoden abzielt -
    und Lösungen über Delegaten etc. fallen nicht unbedingt kürzer aus als entsprechende Erweiterungsmethoden:

        public static class BinaryReaderExtensions
        {
            public static Int32[] ReadArrayInt32(this BinaryReader reader)
            {
                if (reader == null)
                    throw new ArgumentNullException("reader");
    
                int size = reader.ReadInt32();
                if (size < 0)
                    throw new InvalidOperationException("Invalid Size Parameter");
    
                var array = new Int32[size];
                for (int index = 0; index < size; index++)
                    array[index] = reader.ReadInt32();
                return array;
            }
        }
    was als Erweiterungsmethode relativ simpel an unterschiedlichen Stellen eingesetzt
    und äquivalent für weitere Datentypen erstellt werden kann.


    Das anfängliche Positionieren (Header etc.) für eine spezifisches Dateiformat
    sollte man in eine eigene Klasse/Methode verlagern, so dass man ein Duplizieren vermeidet.

    Gruß Elmar
    Mittwoch, 8. August 2012 08:26
    Beantworter

Alle Antworten

  • Hallo Valentin,

    was genau soll dein Programm denn machen? Nur pro Zeile/... an festen Positionen einmal ein Datum und einmal einen Integerwert auslesen?

    Wie sieht die Ausgangsdatei aus? Poste doch bitte mal ein Beispiel, ggfs. auch mit dem gewünschten Ergebnis deiner Methode.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 7. August 2012 23:15
    Moderator
  • Hallo Valentin,

    Mit Generics wird das immer mühsam, da man am Ende doch auf spezifische Methoden abzielt -
    und Lösungen über Delegaten etc. fallen nicht unbedingt kürzer aus als entsprechende Erweiterungsmethoden:

        public static class BinaryReaderExtensions
        {
            public static Int32[] ReadArrayInt32(this BinaryReader reader)
            {
                if (reader == null)
                    throw new ArgumentNullException("reader");
    
                int size = reader.ReadInt32();
                if (size < 0)
                    throw new InvalidOperationException("Invalid Size Parameter");
    
                var array = new Int32[size];
                for (int index = 0; index < size; index++)
                    array[index] = reader.ReadInt32();
                return array;
            }
        }
    was als Erweiterungsmethode relativ simpel an unterschiedlichen Stellen eingesetzt
    und äquivalent für weitere Datentypen erstellt werden kann.


    Das anfängliche Positionieren (Header etc.) für eine spezifisches Dateiformat
    sollte man in eine eigene Klasse/Methode verlagern, so dass man ein Duplizieren vermeidet.

    Gruß Elmar
    Mittwoch, 8. August 2012 08:26
    Beantworter
  • Danke Elmar,

    Deine Lösung hat mir weitergeholfen.


    MfG, Valentin D.

    Mittwoch, 8. August 2012 11:55