C#Indexer属性问题

Ron*_*rby 2 .net c# dictionary indexer properties

我有一个这样的课:

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];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

var someClass = new SomeClass();
var p = someClass.Privileges[13];
Run Code Online (Sandbox Code Playgroud)

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

The given key was not present in the dictionary.

我希望有一个可以以与上面相同的方式访问的属性,但是如果没有密钥,将返回默认对象.

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

    public Privilege Privileges[int key]
    {
        get
        {
            try { return _privileges[key]; }
            catch { return new Privilege(); }
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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

LBu*_*kin 6

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

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

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

protected Privilege GetPrivilege(int key)
{
    try { return _privileges[key]; }
    catch { return new Privilege(); }
}
Run Code Online (Sandbox Code Playgroud)

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

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


Pav*_*aev 5

您必须使用具有所需行为的索引器定义自己的基于IDictionary的类,并在属性getter中返回该实例,而不是库存Dictionary类.