具有私有添加方法或调整能力的 C# 字典

C# Dictionary with Private Add Method or Adjustment Ability

我正在尝试在 class 中创建一个字典,其中有一个私有添加 method/ability 来调整值。基本上我希望能够从 class 外部访问它并查看其中的值,但我不希望任何人在不通过Class。

我首先尝试创建一个 属性 这是一个字典(这样我就可以很容易地尝试用 getter 和私有 setter 做我想做的事)但后来发现这是不可能的。

我知道可能有一种方法可以使用自定义方法或单独的自定义方法来做到这一点 class,但我想先在这里查看是否有任何方法可以做到这一点C#.

告诉我你的想法。谢谢!

您可以使用 IReadOnlyDictionary<TKey,TValue> - 它是 interface all Dictionary classes implement.

但是如果那是您公开的 属性 的类型,那么 没有 Add() 函数可以调用。它有 List 和 Collection “兄弟”,具有相同的功能。

请注意,从技术上讲,某人仍然可以将其转换回 Dictionary<TKey,TValue>,授予他们完整的 R/W 访问权限。这在除安全应用程序之外的所有应用程序中都不应该真正重要。如果重要,只需分发内部词典的克隆即可。

代码可能如下所示:

Dictionary<int, string> SecuredCollection = new Dictionary<int, string>();

public IReadOnlyDictionary<int, string> ThatDictionaryUsersCanOnlyRead
{
    get 
    {
        return SecuredCollection;
    }
}

不可能以仅涉及属性的方式进行。完成你想要的事情的自然方法是使用方法:

public class MyClass
{
    private readonly Dictionary<string, string> users = new Dictionary<string, string>();

    public void Set(string key, string value)
    {
        if (users.ContainsKey(key))
        {
            users[key] = value;
        }
        else
        {
            users.Add(key, value);
        }
    }

    public IDictionary<string, string> ListUsers() 
    {
        return users;
    }
}

注:设置方法为public。您可以使用任何访问说明符,例如 private。

如果我错了请纠正我,但我相信另一种解决方案是简单地 return 一个新的 Dictionary,但将所需的 Dictionary 作为新 Dictionary's构造函数。类似于@Christopher 的回答,但没有 IReadOnlyDictionary.

这样,即使有人试图调整它,它也会失败。但是,我想这意味着它应该附带免责声明,对于不知道它正在提供克隆的人来说,这将是非常误导的。话虽如此,我得出的结论是这是另一种选择,但@Christopher 的解决方案更好。

private Dictionary<int, string> legitDictionary = new Dictionary<int, string>();

public Dictionary<int, string> ClonedDictionary
{
    get 
    {
        return new Dictionary<int, string>(legitDictionary);
    }
}