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语言功能.
如何以相同的方式访问属性,但如果密钥不存在,则获取默认对象?
正如您所发现的,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)