El mecanismo del inyector de propiedades de IronPython para ASP.NET puede simplificar la sintaxis de algunos códigos (para obtener más detalles, consulte mi artículo), pero el soporte predeterminado parece estar incompleto todavía.
Descompilé Microsoft.Web.IronPython.dll y agregué soporte de inyección de propiedades para RepeaterItem y Session (HttpSessionState).
El soporte para RepeaterItem es muy simple porque ya tiene ControlAttributesInjector. Así que simplemente agregue una línea de código al constructor estático de DynamicLanguageHttpModule.cs:
// elemento repetidor.
Ops.RegisterAttributesInjectorForType(tipode(RepeaterItem), nuevo ControlAttributesInjector(), falso);
Session no tiene tanta suerte. Esta clase implementa ICollection, pero no implementa la interfaz IDictionary. Entonces no puedo usar DictionaryAttributesInjector. De ninguna manera, yo mismo agregué una clase SessionAttributesInjector. El código es el siguiente:
usando IronPython.Runtime;
usando Sistema;
usando System.Collections;
usando System.Runtime.InteropServices;
usando System.Web.SessionState;
usando System.Diagnostics
espacio de nombres Microsoft.Web.IronPython.AttributesInjectors {
// añadido por Neil Chen.
clase interna SessionAttributesInjector: IAttributesInjector {
Lista IAttributesInjector.GetAttrNames (objeto obj) {
sesión HttpSessionState = obj como HttpSessionState;
Lista lista = nueva Lista();
foreach (clave de cadena en sesión.Claves) {
lista.Agregar(clave);
}
lista de devolución;
}
bool IAttributesInjector.TryGetAttr(objeto obj, SymbolId nombreSímbolo, valor de objeto de salida) {
sesión HttpSessionState = obj como HttpSessionState;
valor = sesión[nombreSymbol.GetString()];
devolver verdadero;
}
}
}
Adjunto mi Microsoft.Web.IronPython.dll modificado.
Cabe señalar que el inyector de atributos solo es útil para operaciones de obtención, como por ejemplo.
nombre = Sesión. El nombre está bien,
pero la configuración no lo es:
Session.Name = 'algún nombre' informará un error.
Aún necesitas usar esta sintaxis:
Sesión["Nombre"] = 'algún nombre'