Я нашел ответ, который работает, но есть некоторые недостатки. Я надеюсь, что кто-то сможет улучшить это.
@ Эндрю Хэйр сказал, что ни реализует общую базу, ни интерфейс. Ну, на самом деле, они делают. Они оба реализуют IEnumerable и ICollection. Вопрос в том, что с этой информацией в буксировке, вы хотите создать методы расширения, которые расширяют IEnumerable или ICollection, которые действительно предназначены только для Session? Может быть, а может и нет. В любом случае, вот способ удалить дублирование с помощью методов расширения, которые расширяют HttpSessionState и HttpSessionStateBase одновременно:
public static class SessionExtensions
{
public static T Get<T>( this ICollection collection )
{
return collection.Get<T>( typeof( T ).Name );
}
public static T Get<T>( this ICollection collection, string key )
{
object obj = null;
dynamic session = collection as HttpSessionState ?? ( dynamic ) ( collection as HttpSessionStateBase );
if( session != null )
{
obj = session[key];
if (obj != null && !typeof (T).IsAssignableFrom(obj.GetType()))
throw new Exception("Type '" + typeof (T).Name + "' doesn't match the type of the object retreived ('" + obj.GetType().Name + "').");
}
return (T)obj;
}
public static void Put<T>( this ICollection collection, T obj )
{
collection.Put( obj, typeof( T ).Name );
}
public static void Put<T>( this ICollection collection, T obj, string key )
{
dynamic session = collection as HttpSessionState ?? ( dynamic ) ( collection as HttpSessionStateBase );
if(session!=null)
session[ key ] = obj;
}
}
Я не в восторге от этого решения, но это похоже на шаг, по крайней мере, в интересном направлении.