使方法静态时 - 需要对象引用来访问非静态字段,

时间:2016-07-26 09:32:14

标签: c# asp.net visual-studio-2015

访问非静态字段,方法或属性

需要对象引用

当我使GetCartId静态Visual Studio抱怨

public class Uno
{
    private readonly HttpContext context;

    public Uno()
    {
    }

    public Uno(HttpContext _context)
    {
        context = _context;
    }
    public static string GetCartId()
    {
        string cartId = "";
        var stringId = context.Session.GetString("cart");
        if(stringId == null)
        {
            cartId = Guid.NewGuid().ToString();
            stringId = cartId;
        }
        else if(stringId != null)
        {
            cartId = stringId;
        }
        return cartId;
    }
}

2 个答案:

答案 0 :(得分:3)

您正在通过该方法访问context。它需要是静态的才能使用它:

private static readonly HttpContext context;

readonly没有static。实例级别为readonly。 (另一方面,const根据定义是静态的)

我会警告您使用static HttpContext,因为static在ASP.NET中的实例之间共享。您最终可能会混用用户会话!

使用静态方法本身的HttpContext.Current

答案 1 :(得分:2)

context不是静态的,因此您无法在没有Uno实例的静态方法中访问它。但即使这样,你也无法访问它,因为它是private

相反,我会使用HttpContext.Current,它甚至可以在静态方法中使用:

public static string GetCartId()
{
    var context = HttpContext.Current;
    if(context == null) return null;
    string cartId = "";
    var stringId = context.Session.GetString("cart");
    if(stringId == null)
    {
        cartId = Guid.NewGuid().ToString();
        stringId = cartId;
    }
    else if(stringId != null)
    {
        cartId = stringId;
    }
    return cartId;
}