Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

02.11.2016, 11:04

C# Delegate.Invoke() Für zur Compilezeit unbekannten Typen aufrufen???

Hallo Leute :),

ich würde gerne wissen, ob es in C# irgendwie möglich ist, ein DynamicInvoke() vom Objekt des Typs: [Delegate] zur Laufzeit auszuführen?

Unter der Prämisse, das ich keine Ahnung habe, was für ein Delegate das sein könnte, also weder: ob er Parameter hat, noch ob er einen Wert zurückgibt.

Ich wäre euch super dankbar für eure Ratschläge!

C#-Quelltext

1
2
3
            Delegate d = GetDelegateAtRuntime();

            Console.WriteLine(d.DynamicInvoke(//Ich habe keine Ahnung, was für ein Delegate es ist und somit auch nicht über die parameter die er braucht));

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

2

02.11.2016, 11:11

Gegenfrage: Warum weißt du nichts über die Parameter? An welcher Stelle willst du wann genau dieses Delegate aufrufen?
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

3

02.11.2016, 11:19

Die Idee ist einfach, jeglichen Delegaten zur Laufzeit erzeugen zu können, egal um was es sich handelt, also sozusagen ein DynamischerParser von Funktionen wenn man so will:

also kleines Beispiel:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
string lambda = Console.ReadLine(); // in die Konsole wird eingegeben: (x, y) => x < y || x > y + 100 -----------> Nur BEISPIEL! Keine Sinnfragen bitte

//z.B würde das dann abgeleitet werden
Func<int, int, bool> del = System.Dynamic.DynamicExpression.ParseLambda(lambda);

////.....

Mach irgendwas mit del...

Console.Writeline(del(10, 20) //zur Laufzeit würde der Compiler also feststellen, aha: es gibt 2 Parameter x und y und es gibt einen bool zurück, (indem Fall!)


Das war so ein bisschen Pseudoinhalt^^

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »JungleProgger« (02.11.2016, 11:25)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

02.11.2016, 11:55

Willst du also einen Interpreter schreiben? Das würde man nicht mit Delegates angehen. Interessant wäre jetzt wann man diese Funktionen ausführen möchte da man dafür dann ja Parameter benötigt. Wie gesagt dein Code sieht aus als würdest du gerne eine Skriptsprache schreiben. Das würde man aber ganz ganz anders angehen. Wenn es dich interessiert kann ich dazu mal ein paar Links und Bücher raussuchen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

5

02.11.2016, 12:03

@Schorsch

Ich will keinen Interpreter schreiben, sondern lediglich, das was ein Delegate ohnehin schon macht, nur über Strings zur Laufzeit. (Rein sachliche Antwort hier^^)

Also echt nur einen C# LambdaParser, das muss doch auch irgendwie gehen oder nicht?

Wirago

Alter Hase

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

6

02.11.2016, 12:39

So ad hoc fällt mir Linq ein. Da gibt es eine Expression-Klasse die in die Richtung deiner Anforderung geht. Eigentlich müsste da was für dich dabei sein.
https://msdn.microsoft.com/en-us/library…expression.aspx

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

02.11.2016, 13:21

@Schorsch

Ich will keinen Interpreter schreiben, sondern lediglich, das was ein Delegate ohnehin schon macht, nur über Strings zur Laufzeit. (Rein sachliche Antwort hier)

Also echt nur einen C# LambdaParser, das muss doch auch irgendwie gehen oder nicht?

Und wie viel läuft davon bereits? Bekommst du es schon hin für bekannte Typen?
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

8

02.11.2016, 14:21

@Schorsch

Leider nicht, aber ich mache mich mal an die Arbeit :D


Danke für eure Beiträge :)

Renegade

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

9

03.11.2016, 13:40

Hey Jungle,
in C# gibt es die Möglichkeit von Expression Trees mittels Linq. Damit kannst du aus beliebigen Daten Ausdrücke zur Laufzeit erzeugen. Deinen resultierenden Expression Tree kannst du mittles der Compile Methode in einem passenden Delegate speichern und Aufrufen. Viel Spaß beim rum probieren :)
Liebe Grüße,
René

Werbeanzeige