Обнаружение интерфейсов в общих типах - PullRequest
1 голос
/ 15 июля 2009

У меня есть метод:

    public void StoreUsingKey<T>(T value) where T : class, new() {
        var idModel = value as IIDModel;
        if (idModel != null)
            Store<T>(idModel);

        AddToCacheUsingKey(value);
    }

, который я хотел бы при желании вызвать следующим методом на основе реализации параметра value IIDModel.

    public void Store<T>(T value) where T : class, IIDModel, new() {
        AddModelToCache(value);
    }

Есть ли способ сообщить Store<T>, что параметр value из StoreUsingKey<T> реализует IIDModel? Или я поступаю неправильно?

Rich

Ответ

Удаление ограничения new() из каждого метода позволяет коду работать. Проблема была в том, что я пытался выдать интерфейс за объект, который можно создать.

Ответы [ 3 ]

5 голосов
/ 15 июля 2009

Вы уже есть. Помещая ограничение IIDModel в метод Store , вы гарантируете, что параметр value реализует IIDModel.

О, хорошо, теперь я понимаю, что вы говорите. Как насчет этого:

public void StoreUsingKey<T>(T value) where T : class, new() {
                if (idModel is IIDModel)
                        Store<T>((IIDModel)idModel);

                AddToCacheUsingKey(value);
        }

Отредактируйте еще раз: Тинистер прав. Это само по себе не сработает. Однако, если ваш метод Store выглядит как то, что Joel Coehoorn опубликовал , то он должен работать.

2 голосов
/ 15 июля 2009
public void Store(IIDModel value) {
    AddModelToCache(value);
}
1 голос
/ 16 июля 2009

Удаление ограничения new() из каждого метода позволяет коду работать. Проблема была в том, что я пытался выдать интерфейс за объект, который может быть создан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...