23

如何为字典等复杂数据类型定义 getter 和 setter?

public Dictionary<string, string> Users
{
    get
    {
        return m_Users;
    }

    set
    {
        m_Users = value;
    }
}

这会返回整个字典?您能否编写 setter 来查看是否存在特定的键值对,如果不存在,请添加它。否则更新当前的键值对?对于get,你能返回一个特定的键值对而不是整个字典吗?

4

6 回答 6

30

使用索引器属性 ( MSDN ):

public class YourClass
{
    private readonly IDictionary<string, string> _yourDictionary = new Dictionary<string, string>();

    public string this[string key]
    {
        // returns value if exists
        get { return _yourDictionary[key]; }

        // updates if exists, adds if doesn't exist
        set { _yourDictionary[key] = value; }
    }
}

然后像这样使用:

var test = new YourClass();
test["Item1"] = "Value1";
于 2012-07-20T16:53:35.163 回答
20

不可能以仅涉及属性的方式进行。理论上您可以编写一个 setter,但对于 getter,您需要指定一个要检索的键。这是不可能的,因为属性不接受参数。完成您想要的自然方法是使用方法:

private 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 string Get(string key)
{
    string result = null;

    if (users.ContainsKey(key))
    {
        result = users[key];
    }

    return result;
}

或者,正如其他人已经说过的那样,您可以使用索引器,但我一直觉得它们有点麻烦。但我想这只是个人喜好问题。

只是为了完整起见,这就是 setter 的样子,尽管拥有这样的属性是非常不寻常且违反直觉的:

public KeyValuePair<string, string> Users
{
    set
    {
        Set(value.Key, value.Value);
    }
}

在内部,它使用Set我之前的代码片段中的方法。

于 2012-07-20T16:47:22.233 回答
1

您将无法使用属性来做到这一点。您需要为此使用方法,或者将索引器添加到您的类中。该get方法不能接受参数(键)。

另一种选择是,如果您希望某人能够轻松地向字典添加/删除键但阻止他们设置全新的键,则将属性设为只读属性,该属性返回在构造函数中创建的字典。它不如添加 get/set 方法灵活,但在常见的简单情况下,它可以做得很好。

于 2012-07-20T16:44:06.347 回答
1

看起来你想要一个“命名索引器”。这是(我的)使用 C# 完成此任务的一种方法。

我的方法公开了一个属性,该属性返回一个对象(带有默认索引器),该对象将在给定 lambda 的情况下执行对适当字段的索引。

您可能有或不想使用此方法的原因,但我将把它留给您。:)

于 2012-07-20T16:44:40.893 回答
0

使用 setter 可以做到这一点,但非常不推荐,而使用 getter 则完全不可能,因为它不需要参数来确定要获取的内容。

对于 setter,您必须Dictionary<string, string>使用一对传递 a ,但这与您期望 getter/setter 通常做的事情背道而驰,并完全阻止您设置整个 Dictionary。

更好的方法是使用一对方法,如果您愿意,可以将它们命名为 Get 和 Set。

于 2012-07-20T16:49:43.280 回答
0
Dictionary<string, string> param = new Dictionary<string, string>();

public void SetYourParameter(string parametrName, string paramValue)
{
    param[parametrName] = paramValue;            
}

public string GetYourParameter(string parametrName)
{
    // ContainKey ---> It returns value if the key was found
    if( param.ContainsKey(parametrName))
        return param[parametrName];
    else
        return null;
}
于 2014-04-07T11:52:39.533 回答