C # Параметризованный класс свойств реализован с помощью Generics? - PullRequest
1 голос
/ 20 июня 2010

Я хотел бы создать универсальный класс, который я могу использовать для реализации Parameterized Properties в 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??? было бы?

Спасибо за любые решения этой проблемы!

ПРИМЕЧАНИЕ. Как правильно найти индексатор с помощью Reflection, можно найти здесь (предположительно): 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 (желая использовать тип int), но гораздо лучше!Я также добавил в конструктор, чтобы решить эту досадную проблему «я не могу на самом деле установить oReturn to any» =)

Но даже это выглядит не совсем правильно (массивы всегда индексируются с помощью INT, верно? Еслитак что нет необходимости в typeIndexer) ... мне придется снова взглянуть на него в wurk завтра =)

Ответы [ 2 ]

3 голосов
/ 20 июня 2010

Вы хотите что-то вроде этого:

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 голос
/ 20 июня 2010

Поскольку вас, очевидно, не волнует присоединение определенной бизнес-логики к получателю или установщику для этого индексированного свойства (как вы могли бы сделать с индексатором по умолчанию в 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, но не выдает исключение, когда индекс отсутствует.

...