我想构建一个可用于在C#中实现参数化属性的泛型类。我想要的基本代码是:
public class ParameterizedProperty<typeReturn, typeIndexer> {
private typeReturn oReturn = default(typeReturn);
public typeReturn this[typeIndexer oIndexer] {
get { return oReturn[oIndexer]; }
set { oReturn[oIndexer] = value; }
}
}
但由于typeReturn
未知/不受限制,编译器正在oReturn[oIndexer]
行进行绘制。
那么我该如何让它发挥作用呢?我的第一个(好吧,第二个)想法是使用Reflection来有条件地找到索引器(并且如果找不到一个则引发错误)或者可以在类定义上使用where typeReturn: I???
修饰符。但是如果我使用修饰符,I???
会是什么?
感谢您解决此问题!
注意:如何(通常)在这里找到正确的反射索引器:http://www.dotnet247.com/247reference/msgs/3/16665.aspx(见上一条消息)。
编辑:正如Matthew在下面指出的......我在原始描述中有一些错字/错误...我自己的错,真的...原来是在此之前写的床!我想要的代码看起来更像是这样:
public class ParameterizedProperty<typeReturn, typeIndexer> {
private typeReturn[] oReturn;
public ParameterizedProperty(typeReturn[] oSource) {
oReturn = oSource;
}
public typeReturn this[typeIndexer oIndexer] {
get { return oReturn[oIndexer]; }
set { oReturn[oIndexer] = value; }
}
}
......你打赌它会起作用!?
呃,不完全!仍在抱怨typeIndexer
(想要一个“可以”的类型),但更多的更好!我还在一个构造函数中添加了解决那个讨厌的“我实际上无法设置oReturn到任何东西”的问题=)
但是即使这看起来也不太合适(数组总是被INTs索引,对吧?如果是这样的话就不需要typeIndexer)......我明天要在wurk再看看它=)
答案 0 :(得分:3)
你想要这些内容:
public class ParameterizedProperty<typeReturn, typeIndexer> {
private Dictionary<typeIndexer, typeReturn> oReturn = new Dictionary<typeIndexer, typeReturn>();
public typeReturn this[typeIndexer oIndexer] {
get { return oReturn[oIndexer]; }
set { oReturn[oIndexer] = value; }
}
}
答案 1 :(得分:1)
由于您显然不关心将特定业务逻辑附加到此索引属性的getter或setter(就像您可以使用C#中的默认索引器或VB.NET中的任何属性一样),因此您需要一个内部存储机制为了做到这一点。
public class ParameterizedProperty<TReturn, TIndexer>
{
private Dictionary<TIndexer, TReturn> storage = new Dictionary<TIndexer, TReturn>();
public TReturn this[TIndexer index]
{
get
{
TReturn output;
storage.TryGetValue(index, out output);
return output;
}
set { storage[index] = value; }
}
}
但所有这些确实提供了类似于Dictionary
的构造,但在索引不存在时不会抛出异常。