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

6

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

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

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

但我不知道该如何做。

我认为在C++中我可以使用模板,但我不知道泛型能否做到。

怎样才能实现呢?


它们是否都实现了类似的接口?Session是从哪里来的? - Jon Skeet
使用接口,http://msdn.microsoft.com/zh-cn/library/87d83y5b.aspx - Hamid Pourjam
3
@dotctor接口无法实现属性的setter方法。 - Alex Zhukovskiy
4
如果它们无法共享一个基类,你可以使用接口来声明Session并编写扩展方法,而不是使用属性。 - Ant P
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - decPL
显示剩余8条评论
4个回答

7
您有有限的选项来跨多个类型共享实现:
  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();
    }
}

示例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{}

3

假设你不能只是创建一个抽象类并将其用作所有类的基类,那么有几个选项:

1. 使用接口和一对扩展方法:

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;

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();

3
扩展“object”似乎有些粗糙。 - Jodrell
这段代码无法编译。this object 缺少参数名称 - 应该是 this object obj 或类似的形式。此外,setter 中的 value 没有对应的参数。 - Jamiec
1
object 上使用扩展方法就像用大锤敲小钉一样过度了。 - Jamiec
1
此外,还会有许多继承自“object”的类型,其中“Session”将毫无意义。 - Jodrell
@king.code - 看看其他答案,你可以在比“object”更具体的东西上定义扩展方法。 - Jamiec
显示剩余3条评论

-1
创建一个具有此属性的基类,并将其作为所有类的根类。创建金字塔 :-)

他写道,他的类已经继承了其他不同类。C# 只允许一种实现继承。 - JohnSaps

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接