2017-10-05 1 views
2

Zur Zeit habe ich ein paar dieser AnrufeAufrufen Generisches Erweiterung mit dynamisch generetad Lambda

app.CreatePerOwinContext<BasicUserManager>(BasicUserManager.Create); 
app.CreatePerOwinContext<ADUserManager>(ADUserManager.Create); 
... 

Die „Create“ Methoden sind statisch Mitglieder jeder Klasse. Also im Grunde registriert es einen Handler, der aufgerufen wird, sobald ich ein BasicUserManager Objekt von der owinContext anfordere.

Und ich will es so, mit etwas ersetzen:

var types = AppDomain.CurrentDomain.GetAssemblies() 
        .SelectMany(s => s.GetTypes()) 
        .Where(p => typeof(AbstractUserManager).IsAssignableFrom(p) && !p.IsAbstract); 

foreach (var type in types) 
{ 
    app.RegisterUserManagers(type); 
} 

Kein Problem bisher. RegisterUserManagers eine Erweiterung ist, die wie folgt definiert ist:

public static void RegisterSRTUserManager(this IAppBuilder app, Type type) 
{    
    var createPerOwinContextMethod = typeof(AppBuilderExtensions).GetMethods().Where(p => p.Name == "CreatePerOwinContext" && p.GetParameters().Count() == 2).FirstOrDefault().MakeGenericMethod(type); 

    var createMethod = type.GetMethod("Create", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public); 

    var optionsType = typeof(IdentityFactoryOptions<>).MakeGenericType(type); 

    var delegateType = typeof(Func<,,>).MakeGenericType(optionsType, typeof(IOwinContext), type);         

    var body = Expression.Call(createMethod, Expression.Parameter(optionsType, "options"), Expression.Parameter(typeof(IOwinContext), "context"));    

    var func = Expression.Lambda(delegateType, body, Expression.Parameter(optionsType, "options"), Expression.Parameter(typeof(IOwinContext), "context")).Compile(); 

    createPerOwinContextMethod.Invoke(null, new object[] {app, func }); 
} 

Nach dem Lambda-Ausdruck kompilieren, erhalte ich eine Ausnahme:

Zusätzliche Informationen: Variable 'Optionen' des Typs ‚Microsoft.AspNet.Identity. Owin.IdentityFactoryOptions `1 [SeguridadAuth.Login.BD> .AdminOrgUserManager] 'referenziert vom Gültigkeitsbereich' ', ist jedoch nicht definiert.

Ich verstehe, dass params per Verweis hier übergeben werden sollte, aber ich bin nicht in der Lage, wie es in diesem Szenario zu tun ist.

Jede Hilfe wird wirklich geschätzt.

Antwort

1

Bekam es erst nach dem Posten der Frage. Nur benötigt, um den gleichen Parameter Verweis auf beide Methoden zu übergeben.

var optionsPar = Expression.Parameter(optionsType, "options"); 
var contextPar = Expression.Parameter(typeof(IOwinContext), "context"); 

var body = Expression.Call(createMethod, optionsPar, contextPar); 

var func = Expression.Lambda(delegateType, body, optionsPar, contextPar).Compile(); 
Verwandte Themen