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

本文关键字:属性 对象引用 方法 静态 字段 控制器 | 更新日期: 2023-09-27 17:50:28

可能重复:
非静态字段、方法或属性需要对象引用

我有一个非静态字段:

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";
}

编译器在抱怨:

非静态字段、方法或属性。

如何引用此字段?

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

您不能从静态成员访问实例成员,因此您有两个选择。

  1. 使该方法成为实例方法(删除static关键字(
  2. 使字段为静态字段(添加static关键字(

您选择的字段将取决于是否应在所有实例中共享该字段。

我认为编译器在这里非常清楚:您的GetMimeType方法是一个静态方法,但_mappings变量没有声明为静态(非静态或实例字段/变量(。

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

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

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

如果您只想要一个值的字典,它只填充一次,之后再也不会修改,那么您可以做的一件事就是将字典设置为静态的,并将其填充到静态构造函数中。

相关文章: