我有这样一个类:
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/