1

我想构建一个通用类,可用于在 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]线上。

那么我该如何让它发挥作用呢?我的第一个(嗯,第二个)想法是使用反射来有条件地找到索引器(如果没有找到则引发错误),或者可能where typeReturn: I???在类定义上使用修饰符。但是如果我使用修饰符,会I???是什么?

感谢您对此问题的任何解决方案!

注意:如何通过反射正确找到索引器(据说)在这里找到:http: //www.dotnet247.com/247reference/msgs/3/16665.aspx(见最后一条消息)。

编辑:正如马修在下面指出的......我在原始描述中有一些错字/错误......我自己的错,真的......最初是在睡觉前写的!我想要的代码看起来更像这样:

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 设置为任何东西”的问题 =)

但即使这样看起来也不太正确(数组总是由 INT 索引,对吗?如果是这样就不需要 typeIndexer)......我明天必须在 wurk 再看一遍 =)

4

2 回答 2

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; }
    }
}
于 2010-06-20T14:29:31.847 回答
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; }
    }
}

但这实际上只是为您提供了一个类似于 a 的构造,Dictionary但在不存在索引时不会引发异常。

于 2010-06-20T14:31:18.117 回答