C# 索引器属性问题
我有一个像这样的类:
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];
...并且没有键 13,我将收到如下错误:
字典中不存在给定的键。
我想要一个可以以与上面相同的方式访问的属性,但在缺少密钥的情况下将返回默认对象。
我尝试创建这样的索引器属性...
public Privilege Privileges[int key]
{
get
{
try { return _privileges[key]; }
catch { return new Privilege(); }
}
}
...但看起来这不是 C# 2008 语言功能。
如何以相同的方式访问该属性,但如果密钥不存在则获取默认对象?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
正如您所发现的,C# 不支持命名索引器。
您是否考虑过使用常规方法而不是索引器属性? 并不是每个编程问题都需要使用花哨的语法来解决。 是的,您可以使用聚合字典创建自己的 IDictionary 实现并更改属性访问行为 - 但这对于仅获取值或返回默认值的东西真的有必要吗?
我会在您的类中添加这样的方法:
或者更好的是,避免将异常处理作为流程控制机制:
C# does not supported named indexers, as you have discovered.
Have you considered using a regular method instead of an indexer property? Not every programming problem requires the use fancy syntax to solve. Yes, you could create your own IDictionary implementation with an aggregated dictionary and change the property access behavior - but is that really necessary for something that just fetches a value or returns a default?
I would add a method like this to your class:
or better yet, avoid exception handling as a flow control mechanism:
您必须使用具有所需行为的索引器定义自己的基于 IDictionary 的类,并在属性 getter 中返回该类的实例,而不是普通的 Dictionary 类。
You'll have to define your own IDictionary-based class with an indexer that has the desired behavior, and return an instance of that, rather than the stock Dictionary class, in your property getter.
C# 中的索引器只能与
this< 一起使用/code> 关键字。
我怀疑您想要这样的东西:
您可以直接在
SomeClass
中定义它,以便您可以访问如下特权项目:或者在从
IDictionary
(并且内部包含一个Dictionary 用于实际存储数据)。 然后您可以这样使用它:
您似乎建议使用哪种语法,哪种语法可能是最合适的,尽管这需要更多的努力。
Indexers in C# can only be used with the
this
keyword.I suspect you want something like this:
which you can define either directly in
SomeClass
so that you can access a privelege item like:or define this indexer in a custom class that implements from
IDictionary<TKey, TValue>
(and contains aDictionary<TKey, TValue
internally for actually storing the data). You could then use it like:Which is the syntax you seem to propose, and which may be most appropiate, though it takes a bit more effort.
您应该使用以下语法来检索值:
我经常需要这种 IDictionary 的使用,因此我做了一些扩展方法:
现在您可以编写:
You should use this syntax to retrieve the value:
I have a need for this kind of use of IDictionary a lot, so I made some extension methods:
Now you could write: