Interface does not contain a definition for method

↘锁芯ラ 提交于 2019-12-29 08:04:42

问题


I have the following two interfaces:

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

public interface IFacebookMembershipProvider : IMembershipProvider{}

and an implimentation:

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);
    }
}

This is being injected into my controller and assigned to:

private readonly IFacebookMembershipProvider _facebookMembershipProvider;

I'm able to call the Login method without any issue however when I call the SetAuthCookie method:

_facebookMembershipProvider.SetAuthCookie(user.id, false);

I receive the error:

MyNamespace.UserManagement.Interfaces.IFacebookMembershipProvider' does not contain a definition for 'SetAuthCookie'

What am I doing differently with the Login method that I'm not doing with the SetAuthCookie method?

Explicitly casting to the type IMembershipProvier works just fine:

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

I've probably just missed something rudimentary. Thanks for taking a look.

UPDATE

In response to Marks question, the first parameter being passed to the SetAuthCookie method comes from a dynamic object.

dynamic user = _authorizeUserCommand.Invoke(_authorizeUserParams);

回答1:


The curse of dynamic (comments)! Dynamic bleeds. In particular, as soon as you involve dynamic in an expression, the entire thing is performed with dynamic rules, which introduces subtle changes into a number of points.

My advice: resolve the value first:

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

which should work fine. You could also use:

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

since the explicit cast should end the dynamic part of the expression at the argument, so the invoke is not dynamic.



来源:https://stackoverflow.com/questions/9837002/interface-does-not-contain-a-definition-for-method

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!