我的控制器中的非静态字段,方法或属性需要对象引用

时间:2013-01-03 14:57:58

标签: c# asp.net asp.net-mvc asp.net-mvc-4

  

可能重复:
  An object reference is required for the non-static field, method, or property

我有一个非静态字段:

private IDictionary<string, string> _mappings = 
    new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase)

我想在这样的动作中使用:

public static string GetMimeType(string extension)
{
    //...
    return _mappings.TryGetValue(extension, out mime) ? 
        mime : "application/octet-stream";
}

编译器抱怨:

  

非静态字段,方法或的对象引用是必需的   返回声明中的财产。

如何引用此字段?

3 个答案:

答案 0 :(得分:15)

您无法从静态成员访问实例成员,因此您有2个选择。

  1. 将该方法设为实例方法(删除static关键字)
  2. 将字段设为静态字段(添加static关键字)
  3. 您选择的那个将取决于该字段是否应该在所有实例之间共享。

答案 1 :(得分:1)

我认为编译器在这里很清楚:你的GetMimeType方法是一个静态方法,但_mappings变量不是静态的(非静态或实例字段/变量)。

如果要使用上面显示的映射变量,请执行以下操作:

private static IDictionary<string, string> _mappings = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase)

编辑:正如评论者指出的那样,你必须小心这实际上是你想要的行为。静态成员意味着所有实例将共享同一个映射变量,并且可以覆盖存在的数据。如果您希望每个类有一个映射变量,那么您应该将方法更改为实例方法(通过删除static关键字),如上面的答案中所述。

答案 2 :(得分:0)

如果你只想要一个填充一次并且之后从未修改的值的字典,那么你可以做的就是使字典静态并在静态构造函数中填充它。