在属性getter中获取字典键

本文关键字:字典 获取 属性 getter | 更新日期: 2023-09-27 18:04:43

是否可以检查value是否为null

Dictionary <string,object> coll = new Dictionary <string,object> ();
public Dictionary <string,object> Pdict
{
    get
    {
        //can I check here which key is requested
        //if(coll[keyname ] == null)coll[keyname ] =           new myclass();
        return coll;
    }
    set
    {
        coll = value;
    }
}
// when I do this I need key name in property getter.
object obj = Pdict[key];

目的是初始化被请求的对象,而不是全部。

在属性getter中获取字典键

在此设置中无法检查请求的键,因为getter返回整个字典对象,而不一定对其进行索引。例如,可以访问字典

上的方法
if(myObj.Pdict.ContainsKey(someKey))

相反,如果你想限制访问,你可以在你的类上实现Indexer并隐藏你的字典。

protected Dictionary<string, object> coll = new Dictionary<string, object>();
public object this[string key]
{
    get
    {
        if(coll.ContainsKey(key) == false)
            coll.Add(key, this.CreateObjectForDictionary(key))
        return coll[key];
    }
}

同样,如果你想确保你的字典是一个字典,你可以实现一个新的类,从dictionary继承,并在每次请求访问一个还不存在的对象时创建对象。

我可以在这里检查请求的是哪个键吗

不,你不能。您现在有一个属性,它将返回整个字典对象,然后使用它从中选择键/值。

一个选项是创建一个函数,它将只返回你正在寻找的值,或者在值为空/缺失时做一些事情。

Dictionary <string,object> coll = new Dictionary <string,object> ();
public object GetCollValue(string key)
{
    if (!coll.ContainsKey(key))
    {
        //logic for "not exists"
    }
    var value = coll[key];
    if (value == null)
    {
        //logic for "is null"
    }
    return value;
}

现在只需调用你想要的键的方法。

object obj = GetCollValue(key);

您可以使用这个辅助函数从字典中获取值,而不会因为缺少键而遇到异常:

    public object GetValue(string key, object defaultValue = null)
    {
        Object val;
        if (Pdict.TryGetValue(key, out val)) return val;
        return defaultValue;
    }

不能将其作为属性。您可以使用一个方法:

public Object GetDictValue(String Key)
{
    if (Pdict.ContainsKey(Key))
        return Pdict[Key];
    Pdict.Add(Key, null);
    return null;
}

然后只使用属性来检索整个Dictionary

使用索引器代替普通属性:

public object this[ string key ]
{
    get
    {
        return coll[ key ];
    }
    set
    {
        coll[ key ] = value;
    }
}