Механизм внедрения свойств IronPython для ASP.NET может упростить синтаксис некоторых кодов (подробнее см. в моей статье), но поддержка по умолчанию, похоже, еще неполная.
Я декомпилировал Microsoft.Web.IronPython.dll и добавил поддержку внедрения свойств для RepeaterItem и Session (HttpSessionState).
Поддержка RepeaterItem очень проста, поскольку у него уже есть ControlAttributesInjector. Поэтому просто добавьте строку кода в статический конструктор DynamicLanguageHttpModule.cs:
// элемент повторителя.
Ops.RegisterAttributesInjectorForType(typeof(RepeaterItem), новый ControlAttributesInjector(), false);
Сессии не так повезло. Этот класс реализует ICollection, но не реализует интерфейс IDictionary. Поэтому я не могу использовать DictionaryAttributesInjector. Ни в коем случае, я сам добавил класс SessionAttributesInjector. Код следующий:
использование IronPython.Runtime;
использование системы;
использование System.Collections;
использование System.Runtime.InteropServices;
использование System.Web.SessionState;
используя пространство имен System.Diagnostics
Microsoft.Web.IronPython.AttributesInjectors {;
// добавлено Нилом Ченом.
внутренний класс SessionAttributesInjector: IAttributesInjector {
Список IAttributesInjector.GetAttrNames(объект obj) {
Сеанс HttpSessionState = объект как HttpSessionState;
Список списка = новый список();
foreach (строковый ключ в session.Keys) {
список.Добавить(ключ);
}
список возврата;
}
bool IAttributesInjector.TryGetAttr(object obj, SymbolId nameSymbol, значение объекта out) {
Сеанс HttpSessionState = объект как HttpSessionState;
значение = сеанс [nameSymbol.GetString()];
вернуть истину;
}
}
}
Прикреплен мой модифицированный Microsoft.Web.IronPython.dll.
Следует отметить, что инжектор атрибутов полезен только для операций получения, таких как.
name = Session.Name в порядке,
но настройка — нет:
Session.Name = 'какое-то имя' сообщит об ошибке.
Вам все еще нужно использовать этот синтаксис:
Session["Имя"] = 'какое-то имя'