C# 如何为字典编写getter和setter?

C# 如何为字典编写getter和setter?,c#,dictionary,getter-setter,C#,Dictionary,Getter Setter,如何为复杂数据类型(如字典)定义getter和setter public Dictionary<string, string> Users { get { return m_Users; } set { m_Users = value; } } 公共字典用户 { 得到 { 返回m_用户; } 设置 { m_用户=价值; } } 这会返回整个字典吗?可以编写setter来查看是否存在特定的键值对,如果

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

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

    set
    {
        m_Users = value;
    }
}
公共字典用户
{
得到
{
返回m_用户;
}
设置
{
m_用户=价值;
}
}

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

您将无法使用属性执行此操作。您需要为此使用方法,或者向类中添加索引器。
get
方法无法接受参数(键)

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

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

看起来您需要一个“命名索引器”。下面是(我的)使用C#实现这一点的方法

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


您可能想使用此方法,也可能不想使用此方法,但我将把它留给您。:)

不可能以只涉及属性的方式进行操作。理论上可以编写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;
}
private Dictionary users=new Dictionary();
公共无效集(字符串键、字符串值)
{
if(users.ContainsKey(key))
{
用户[键]=值;
}
其他的
{
用户。添加(键、值);
}
}
公共字符串获取(字符串键)
{
字符串结果=null;
if(users.ContainsKey(key))
{
结果=用户[键];
}
返回结果;
}
或者,正如其他人已经说过的,您可以使用索引器,但我总是觉得它们有点麻烦。但我想这只是个人喜好的问题

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

public KeyValuePair<string, string> Users
{
    set
    {
        Set(value.Key, value.Value);
    }
}
公钥值对用户
{
设置
{
设置(value.Key,value.value);
}
}
在内部,它使用我上一段代码中的
Set
方法。

可以使用setter进行设置,但高度不推荐,而使用getter则完全不可能,因为它不需要任何参数来确定要获取什么

对于setter,您必须用一对传递一个
字典
,但这与您期望getter/setter通常所做的相反,并且完全阻止您设置整个字典

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

使用索引器属性():

Dictionary param=newdictionary();
public void SetYourParameter(字符串参数名称、字符串参数值)
{
param[parametrName]=paramValue;
}
公共字符串GetYourParameter(字符串参数名称)
{
//ContainKey-->如果找到该键,则返回值
if(参数ContainsKey(参数名称))
返回参数[ParameterName];
其他的
返回null;
}

使用索引器属性。谢谢你的回复。现在我知道我的选择了。我更喜欢创建get和set方法,而不是使用索引器。只是不直接。为什么不直接使用索引器呢?因为在一个类上,可能有多个索引器采用相同的参数类型。子项[int-index]和客户[int-index]。此外,OP的用例显示了在obj.Foo[…]中使用的名称,而不是obj[…]链接不再工作。请更新并将解决方案的要点添加到您的答案中,这样就不会再发生这种情况。值得注意的是,您可以从技术上使用属性来设置值(只需使用“keyvaluepair”类型的属性即可)。您不能使用
get
ter来获取密钥的值(或对),因为您不能指定密钥。@Servy当然,从技术上讲,您可以,但这很不自然。我通常不会说任何话,但您不仅说这在技术上是不可能的(这是真的),而且说这在技术上对这两种情况都是不可能的(这不是真的)。对于一个能干的人来说,这是不可能的,而且通过一个二传者是不方便和不直观的。@Servy你是对的。提醒我在措辞我的答案时要小心:)好的!但是正如Nicola Anusev所说的,在设置属性时,您应该使用
\u yourdiodictionary.ContaineKey(key)
检查它是否已经存在。如果ot不存在,你应该用yourDictionary.Add(key,value)设置它,这只在类不是静态的情况下才有效,可能需要为静态类想出一个替代方案…@TGarrett这是非静态字典类的包装类。如果有的话,它可以变得通用,但我认为不需要静态实现。如果你这样做,我洗耳恭听!
var test = new YourClass();
test["Item1"] = "Value1";
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;
}