我有几个继承自不同类的类。 所有这些类都有一个会话属性(他们定义或继承)。
我想为所有这些类添加一个属性:
public SessionObject SessionObject
{
get
{
return Session["SessionObject"] as SessionObject;
}
set
{
Session["SessionObject"] = value;
}
}
但我不知道如何。
我认为在C ++中我可以使用模板,但我没有看到Generics这样做。
怎么做?
答案 0 :(得分:6)
您有多种选项可以跨多种类型共享实施
如果您的所有对象已共享一个公共基类,请将其添加到那里。如果他们根本不使用继承,你可以定义一个基类 - 但是C#只允许一个实现继承
使用合成,这涉及只使用您的属性编写一个类,并在所有类上具有该属性(参见示例1)
使用扩展方法 - 您可以在"标记上执行此操作"接口(没有实际方法)或对象本身(见例2)
示例1
public class SessionContainer
{
public SessionObject SessionObject
{
get
{
return Session["SessionObject"] as SessionObject;
}
set
{
Session["SessionObject"] = value;
}
}
}
public class YourClass1
{
public SessionContainer Session { get; private set; }
public YourClass1
{
this.Session = new SessionContainer();
}
}
public class YourClass2
{
public SessionContainer Session { get; private set; }
public YourClass2
{
this.Session = new SessionContainer();
}
}
示例2(使用空标记接口)
public interface ISessionContainer{}
public static class SessionExtensions
{
public static SessionObject GetSessionObject(this ISessionContainer session)
{
return session["SessionObject"] as SessionObject;
}
public static void SetSessionObject(this ISessionContainer session,
SessionObject obj)
{
session["SessionObject"] = obj;
}
}
public class YourClass1 : ISessionContainer{}
public class YourClass2 : ISessionContainer{}
答案 1 :(得分:2)
一些选项(假设您不能只创建一个抽象类并将其用作所有内容的基类)。
使用接口和一对扩展方法:
public interface IHasSession
{
public Session Session { get; set; }
}
public static class HasSessionExtensions
{
public static void SetSessionObject(this IHasSession subject, SessionObject value)
{
subject.Session["SessionObject"] = value;
}
public static SessionObject GetSessionObject(this IHasSession subject)
{
return subject.Session["SessionObject"] as SessionObject;
}
}
或者为会话使用包装类:
public class SessionWrapper
{
public Session Session { get; set; }
public SessionObject SessionObject
{
get
{
return Session["SessionObject"] as SessionObject;
}
set
{
Session["SessionObject"] = value;
}
}
}
而是把它放在你的其他课程上:
public SessionWrapper SessionWrapper { get; set; }
然后你只需要实现一次并可以通过以下方式访问它:
var obj = myThing.SessionWrapper.SessionObject;
答案 2 :(得分:0)
使用此属性创建一个基类,并使其成为所有类的根类。创建金字塔: - )
答案 3 :(得分:0)
您可以在对象类型上创建2个扩展方法,而不是创建属性:
public static class MyExtensions
{
public static void SetSessionObject(this object o, SessionObject value)
{
Session["SessionObject"] = value;
}
public static SessionObject GetSessionObject(this object o)
{
return Session["SessionObject"] as SessionObject;
}
}
你可以像这样使用它:
youClassInstance.GetSessionObject();