如何为复杂数据类型(如字典)定义getter和setter?
public Dictionary<string, string> Users
{
get
{
return m_Users;
}
set
{
m_Users = value;
}
}
这会返回整个字典吗?你能编写setter来查看是否存在特定的键值对,然后如果不存在,则添加它。否则更新当前的键值对?对于get,你可以返回一个特定的键值对而不是整个字典吗?
答案 0 :(得分:27)
使用索引器属性(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";
答案 1 :(得分:18)
不可能以仅涉及属性的方式进行。理论上 可以写一个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;
}
或者,正如其他人已经说过的那样,你可以使用索引器,但我总是发现它们有点麻烦。但我想这只是个人偏好的问题。
只是为了完整起见,这就是一个二传手看起来像的样子,尽管拥有这样一个属性非常不寻常和反直觉:
public KeyValuePair<string, string> Users
{
set
{
Set(value.Key, value.Value);
}
}
在内部,它使用我之前代码段中的Set
方法。
答案 2 :(得分:1)
您将无法使用属性执行此操作。您需要使用方法,或者为您的类添加索引器。 get
方法无法接受参数(密钥)。
另一种选择,如果您希望某人能够轻松地向字典添加/删除密钥但阻止他们设置一个全新的密钥,那么将使该属性成为只读属性,该属性返回在构造函数中创建的字典。它会比添加get / set方法更不灵活,但在通常的简单情况下,它可以做得很好。
答案 3 :(得分:0)
看起来你想要一个“命名索引器”。这是(我的)one使用C#实现这一目标的方法。
我的方法公开了一个返回一个对象(带有一个默认索引器)的属性,该对象将在给定lambdas的情况下执行索引到相应的字段。
您可能有或没有想要使用此方法,但我会留给您。 :)
答案 4 :(得分:0)
可以使用setter进行,但是非常不推荐,并且使用getter是完全不可能的,因为它不需要参数来确定要获取的内容。
对于setter,你必须传递Dictionary<string, string>
一对,但它与你期望的getter / setter通常做的一样,并完全停止你设置整个Dictionary。
更好的方法是使用一对方法,如果你愿意,可以命名为Get和Set。
答案 5 :(得分: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;
}