通过泛型实现的C#参数化属性类?

时间:2010-06-20 14:18:49

标签: c# generics reflection indexer

我想构建一个可用于在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再看看它=)

2 个答案:

答案 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的构造,但在索引不存在时不会抛出异常。