Tag: 索引器

关于索引器和/或generics的问题

如何知道对象是否实现索引器?我需要共享DataRow和IDataReader的逻辑,但它们不共享任何接口。 我也尝试使用generics,但不知道我应该对where子句施加什么限制。 public class Indexer { // myObject should be a DataRow or a IDataReader private object myObject; public object MyObject { get { return myObject; } set { myObject = value; } } // won’t compile, myObject has no indexer public object this[int index] { get { return myObject[index]; } set { myObject[index] = […]

如何编写一个函数来使用索引运算符获取任何对象

我想我过去在C ++(在我的问题历史记录中找不到它)的上下文中问过这个问题,解决方法是使用模板函数。 当C ++模板在编译时解析时,它可以工作。 但是对于C#,它没有。 public Hashtable ConvertToHashtable(T source) where T has an index operator { Hashtable table = new Hashtable(); table[“apple”] = source[“apple”]; return table; } 目前的一种用法是将OleDbReader中的结果转换为哈希表,但我预计很快就会需要更多源类型。

C#索引器的优点是什么?

做了一些代码阅读,并偶然发现了我之前从未见过的片段: public SomeClass { public someInterface this[String strParameter] { get { return SomeInternalMethod(strParameter); } } } 它看起来像是如下调用: SomeClass _someClass = new SomeClass(); SomeInterface returnedValue = _someClass[“someString”]; 我感兴趣的是这个函数适合的位置或者这种风格的写作意图。 例如,为什么这比仅仅调用函数更受欢迎?

C#多个索引器

是否有可能具有以下内容: class C { public Foo Foos[int i] { … } public Bar Bars[int i] { … } } 如果没有,那么我可以通过哪些方式实现这一目标? 我知道我可以创建名为getFoo(int i)和getBar(int i)的函数,但我希望用属性来做这个。

使用Moq在C#中设置索引器

我无法弄清楚如何使用Moq在C#中设置索引器 。 Moq文档很薄弱,我已经做了很多搜索……我想做的事情在如何设置索引属性的解决方案中类似: var someClass = new Mock(); someClass.SetupSet(o => o.SomeIndexedProperty[3] = 25); 我想修改上面的内容以适用于任何索引和任何值,所以我可以这样做: someClass.Object.SomeIndexedProperty[1] = 5; 目前我有以下内容,它对索引属性getter非常有用,但如果我设置了值,则Moq会忽略它: var someValues = new int[] { 10, 20, 30, 40 }; var someClass = new Mock(); someClass.Setup(o => o.SomeIndexedProperty[It.IsAny()]) .Returns(index => someValues[index]); // Moq doesn’t set the value below, so the Assert fails! someClass.Object.SomeIndexedProperty[3] = 25; Assert.AreEqual(25, […]

具有索引器和名为“Item”的属性的类

是否可以在.NET 4中创建一个类: 一个索引器, 一个名为“Item”的属性? 例如,这个C#类不会为我编译: public class MyClass { public object Item { get; set; } public object this[string index] { get { return null; } set { } } } 编译器给出错误CS0102 : “MyClass”类型已包含“Item”的定义 虽然我只是明确定义Item一次。