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

Ser*_*ook 5 c# asp.net

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

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

public SessionObject SessionObject
{
    get
    {
        return Session["SessionObject"] as SessionObject;
    }
    set
    {
        Session["SessionObject"] = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

但我不知道怎么做.

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

怎么做到呢?

Jam*_*iec 6

您可以使用有限数量的选项来跨多种类型共享实现

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

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

  3. 使用扩展方法 - 您可以在"标记"界面(没有实际方法)或对象本身上执行此操作(请参阅示例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();
    }
}
Run Code Online (Sandbox Code Playgroud)

示例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{}
Run Code Online (Sandbox Code Playgroud)