2009-04-21 8 views
5

Abbiamo un requisito in cui dobbiamo generare al volo tipi di delegati. Abbiamo bisogno di generare delegati dati i parametri di input e l'output. Sia l'input che l'output sarebbero tipi semplici.Generazione dinamica dei tipi di delegati in C#

ad esempio, abbiamo bisogno di generare

int Del(int, int, int, string) 

e

int Del2(int, int, string, int) 

Eventuali indicazioni su come iniziare su questo sarebbe molto utile.

Abbiamo bisogno di analizzare formulato che sono rappresentati come xml.

Per esempio, ci rappresentano (a + b) come

<ADD> 
    <param type="decimal">A</parameter> 
    <param type="decimal">B</parameter> 
</ADD> 

Ora vogliamo questo per essere esposto come Func<decimal, decimal, decimal>. Noi, naturalmente, vogliamo consentire nodi nidificati nel xml, per esempio:

(a + b) + (a - b * (c - d))) 

Vogliamo farlo usando alberi di espressione e Expression.Compile.

I suggerimenti sulla fattibilità di questo approccio sono i benvenuti.

risposta

10

Il modo più semplice sarebbe utilizzare la famiglia di delegati esistente Func.

Utilizzare typeof(Func<,,,,>).MakeGenericType(...). Ad esempio, per il vostro tipo di int Del2(int, int, string, int):

using System; 

class Test 
{ 
    static void Main() 
    { 
     Type func = typeof(Func<,,,,>); 
     Type generic = func.MakeGenericType 
      (typeof(int), typeof(int), typeof(string), 
      typeof(int), typeof(int)); 
     Console.WriteLine(generic); 
    } 
} 

Se davvero, davvero bisogno di creare un nuovo tipo veramente, forse si potrebbe dare un po 'di contesto per aiutarci ad aiutarti meglio.

EDIT: Come dice Olsin, i tipi Func fanno parte del NET 3.5 - ma se si desidera utilizzarli in .NET 2.0, basta dichiarare da soli, in questo modo:

public delegate TResult Func<TResult>(); 
public delegate TResult Func<T, TResult>(T arg); 
public delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2); 
public delegate TResult Func<T1, T2, T3, TResult> 
    (T1 arg1, T2 arg2, T3 arg3); 
public delegate TResult Func<T1, T2, T3, T4, TResult> 
    (T1 arg1, T2 arg2, T3 arg3, T4 arg4); 

Se 4 argomenti non ti bastano, puoi aggiungerne di più ovviamente.

+0

Hi, pubblicato una modifica con il requisito. –

+0

A B è un esempio. Vogliamo creare un metodo callable da questo in fase di runtime. –

+0

Ho paura che tu non ci abbia dato abbastanza informazioni su quale sia il problema o l'approccio per giudicare se sia una buona idea o meno. Usare gli alberi delle espressioni in generale suona come un approccio ragionevole, ma non sono abbastanza sicuro di come si possa inserire il resto della tua domanda. –

0

La risposta di Jon funziona bene se si esegue il framework 3.5 (ma non tutti lo sono).

La risposta 2.0 è quello di utilizzare Delegate.CreateDelegate (...)

http://msdn.microsoft.com/en-us/library/system.delegate.createdelegate.aspx

Un confronto di vari modi per fare questo compreso di Jon Func, Delegate.CreateDelegate, DynamicMethods e vari altri trucchi è stata discussa su un thread precedente:

Delegate.CreateDelegate vs DynamicMethod vs Expression

-Oisin

+3

Delegate.CreateDelegate crea una * istanza * di un tipo delegato, non il tipo stesso. –

+0

oops, ovviamente. F00F. – x0n

Problemi correlati