C# 索引器属性问题

标签 c# .net dictionary properties indexer

我有这样一个类:

public class SomeClass
{
    private const string sessionKey = "__Privileges";
    public Dictionary<int, Privilege> Privileges
    {
        get
        {
            if (Session[sessionKey] == null)
            {
                Session[sessionKey] = new Dictionary<int, Privilege>();
            }

            return (Dictionary<int, Privilege>)Session[sessionKey];
        }
    }
}

现在,如果我这样做...

var someClass = new SomeClass();
var p = someClass.Privileges[13];

...并且没有 key 13,我会得到这样的错误:

字典中不存在给定的键。

我想要一个属性,可以像上面一样访问,但在没有 key 的情况下将返回一个默认对象。

我尝试创建这样的索引器属性...

    public Privilege Privileges[int key]
    {
        get
        {
            try { return _privileges[key]; }
            catch { return new Privilege(); }
        }
    }

...但看起来这不是 C# 2008 语言功能。

如果 key 不存在,我如何以相同的方式访问该属性,但获取默认对象?

最佳答案

正如您所发现的,C# 不支持命名索引器。

您是否考虑过使用常规方法而不是索引器属性?并非每个编程问题都需要使用花哨的语法来解决。是的,您可以使用聚合字典创建您自己的 IDictionary 实现并更改属性访问行为 - 但对于只获取值或返回默认值的东西真的有必要吗?

我会在你的类中添加这样的方法:

protected Privilege GetPrivilege(int key)
{
    try { return _privileges[key]; }
    catch { return new Privilege(); }
}

或者更好的是,避免将异常处理作为流程控制机制:

protected Privilege GetPrivilge( int key )
{
    Privilege priv;
    if( _privileges.TryGetValue( key, out priv ) )
        return priv;
    else
        return new Privilege();
}

关于C# 索引器属性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1088223/

相关文章:

c# - 如何使用返回 refcursor 的 FluentNHibernate 调用 postgresql 存储函数

c# - 如何获取当前属性的 PropertyDescriptor?

c# - 将整数增加到 65535 的最佳线程安全方法

c# - 如何检查特定IP地址是否连接到网络

c# - 文件正在通过 visual studio 下载,而不是通过 .exe 下载

c# - 在 If 条件中内联 TryGetValue 并评估其值

python - dict 追加键和值的列表

c# - SqlDependency - 如何解释 SqlNotificationEventArgs 属性?

c# - .NET 的 HTML 到 PDF 转换器

c++ - 使用 map 作为 "Phonebook"