如何在几个C#类之间共享属性

时间:2014-12-11 10:57:41

标签: c# asp.net

我有几个继承自不同类的类。 所有这些类都有一个会话属性(他们定义或继承)。

我想为所有这些类添加一个属性:

public SessionObject SessionObject
{
    get
    {
        return Session["SessionObject"] as SessionObject;
    }
    set
    {
        Session["SessionObject"] = value;
    }
}

但我不知道如何。

我认为在C ++中我可以使用模板,但我没有看到Generics这样做。

怎么做?

4 个答案:

答案 0 :(得分:6)

您有多种选项可以跨多种类型共享实施

  1. 如果您的所有对象已共享一个公共基类,请将其添加到那里。如果他们根本不使用继承,你可以定义一个基类 - 但是C#只允许一个实现继承

  2. 使用合成,这涉及只使用您的属性编写一个类,并在所有类上具有该属性(参见示例1)

  3. 使用扩展方法 - 您可以在"标记上执行此操作"接口(没有实际方法)或对象本身(见例2)


  4. 示例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();