Интерфейс не содержит определения метода - PullRequest
3 голосов
/ 23 марта 2012

У меня есть два следующих интерфейса:

public interface IMembershipProvider
{
    object Login(ILoginProviderParameters loginParameters);
    void SetAuthCookie(string userName, bool createPersistentCookie);
}

public interface IFacebookMembershipProvider : IMembershipProvider{}

и имплиментация:

public class FacebookMembershipProvider: IFacebookMembershipProvider
{
    public object Login(ILoginProviderParameters loginParameters)
    {
        // Facebook login code is here
    }

    public void SetAuthCookie(string userName, bool createPersistentCookie)
    {
        FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
    }
}

Это вводится в мой контроллер и назначается:

private readonly IFacebookMembershipProvider _facebookMembershipProvider;

Я могу вызвать метод Login без каких-либо проблем, однако, когда я вызываю метод SetAuthCookie:

_facebookMembershipProvider.SetAuthCookie(user.id, false);

Я получаю сообщение об ошибке:

MyNamespace.UserManagement.Interfaces.IFacebookMembershipProvider 'не содержит определения для SetAuthCookie

Что я делаю по-другому в методе Login, а в методе SetAuthCookie нет?* Явное приведение к типу IMembershipProvier прекрасно работает:

((IMembershipProvider)_facebookMembershipProvider).SetAuthCookie(user.id, false);

Я, наверное, только что пропустил что-то элементарное.Спасибо, что заглянули.

ОБНОВЛЕНИЕ

В ответ на вопрос Marks первый параметр, передаваемый методу SetAuthCookie, происходит от объекта dynamic.

dynamic user = _authorizeUserCommand.Invoke(_authorizeUserParams);

1 Ответ

4 голосов
/ 23 марта 2012

Проклятие dynamic (комментарии)!Динамические кровотечения.В частности, как только вы задействуете dynamic в выражении, вся вещь выполняется с dynamic правилами, которые вносят незначительные изменения в ряд пунктов.

Мой совет: сначала разрешите значение:

string id = user.id; // this has an implicit cast to string
_facebookMembershipProvider.SetAuthCookie(id, false);

, которое должно работать нормально.Вы также можете использовать:

_facebookMembershipProvider.SetAuthCookie((string)user.id, false);

, поскольку явное приведение должно заканчиваться частью выражения dynamic в аргументе, поэтому вызывается , а не dynamic.

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