【问题标题】:When making the method static -- an object reference is required to access non-static field,将方法设为静态时——访问非静态字段需要对象引用,
【发布时间】:2016-07-26 17:45:06
【问题描述】:

访问非静态字段、方法或属性需要对象引用

当我让 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;
    }
}

【问题讨论】:

  • @poke,我用一般的“从静态访问实例成员”问题投票关闭这个问题是错误的。这个问题与HttpContext.Current 相关。

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


【解决方案1】:

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

private static readonly HttpContext context;

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

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

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

【讨论】:

    【解决方案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;
    }
    

    【讨论】:

    • 是的,我已经实现并编辑了我的代码。现在,它可以工作了,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多