我的控制器中的非静态字段,方法或属性需要对象引用
可能重复:
非静态字段,方法或属性需要对象引用
我有一个非静态字段:
private IDictionary _mappings = new Dictionary(StringComparer.InvariantCultureIgnoreCase)
我想在这样的动作中使用:
public static string GetMimeType(string extension) { //... return _mappings.TryGetValue(extension, out mime) ? mime : "application/octet-stream"; }
编译器抱怨:
return语句中的非静态字段,方法或属性需要对象引用。
我该如何参考这个字段?
您无法从静态成员访问实例成员,因此您有2个选择。
- 使方法成为实例方法(删除
static
关键字) - 使字段成为静态(添加
static
关键字)
您选择的那个将取决于该字段是否应在所有实例之间共享。
我认为编译器在这里非常清楚:您的GetMimeType方法是一个静态方法,但_mappings变量未声明为静态(非静态或实例字段/变量)。
如果要使用上面显示的映射变量,请执行以下操作:
private static IDictionary _mappings = new Dictionary(StringComparer.InvariantCultureIgnoreCase)
编辑:正如评论者指出的那样,你必须小心,这实际上是你想要的行为。 静态成员意味着所有实例将共享同一个映射变量,并且可以覆盖存在的数据。 如果您希望每个类有一个映射变量,那么您应该将方法更改为实例方法(通过删除static关键字),如上面的答案中所述。
如果你只想要一个填充一次并且之后从未修改的值的字典,那么你可以做的就是使字典静态并在静态构造函数中填充它。