none
Typ Parameter als Variable möglich? RRS feed

  • Frage

  • Hallo,

    ist es möglich bei einem Typ Parameter eine Variable zu verwenden anstatt die Klasse direkt hinzuschreiben?

          Entry_Date.Entry_Date d = Entry_Create<Entry_Date.Entry_Date>();

    Also stattdessen etwas in der Art
          Type t = typeof(Entry_Date.Entry_Date);
          d = Entry_Create<t>();

         Das lässt der Compiler so nicht zu.    

     

      // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        internal T_Entry Entry_Create<T_Entry>() where T_Entry : new()
        // ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
        {
          return new T_Entry();
        }

    Montag, 8. April 2019 15:59

Antworten

  • Hi Markus,
    die generischen Typen und Member haben mit der Ausführung nichts zu tun. Sie sind "Anweisungen" für den Compiler, typsicheren Code zu erzeugen. Der Compiler muss zur Entwurfszeit den Typ kennen, damit er eine entsprechende Implementierung erzeugen kann. Was Du machen kannst, ist über die Mutter aller Typen (object) zu gehen und eine Instanz eines Zieltyps zu erzeugen. Wenn Du die Prüfung auf das Vorhandensein eines parameterlosen Konstruktors benötigst, musst Du Reflection bemühen. Hier mal eine einfache Konsolendemo ohne Prüfung auf einen parameterlosen Konstruktor.

    using System;
    
    namespace ConsoleApp1
    {
      class Program05
      {
        static void Main(string[] args)
        {
          try
          {
            Demo c = new Demo();
            var res = c.Execute();
            Console.WriteLine(res);
          }
          catch (Exception ex) { Console.WriteLine(ex.ToString()); }
          Console.WriteLine("Continue enter key");
          Console.ReadKey();
        }
    
        internal class Demo
        {
          internal object Execute()
          {
            Type t = typeof(Demo);
            var d = this.Entry_Create(t);
            return d;
          }
    
          internal object Entry_Create(Type T_Entry)
          {
            return Activator.CreateInstance(T_Entry);
          }
        }
      }
    }


    --
    Best Regards / Viele Grüße
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks


    Dienstag, 9. April 2019 02:45