Interface does not contain a definition for method

2020-02-12 14:17发布

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

标签: c# interface
1条回答
叛逆
2楼-- · 2020-02-12 15:04

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.

查看更多
登录 后发表回答