接口不包含方法的定义

Jam*_*xon 3 c# interface

我有以下两个接口:

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

public interface IFacebookMembershipProvider : IMembershipProvider{}
Run Code Online (Sandbox Code Playgroud)

和一个实现:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这被注入我的控制器并分配给:

private readonly IFacebookMembershipProvider _facebookMembershipProvider;
Run Code Online (Sandbox Code Playgroud)

我可以Login毫无问题地调用该方法,但是当我调用该SetAuthCookie方法时:

_facebookMembershipProvider.SetAuthCookie(user.id, false);
Run Code Online (Sandbox Code Playgroud)

我收到错误:

MyNamespace.UserManagement.Interfaces.IFacebookMembershipProvider' 不包含 'SetAuthCookie' 的定义

我用 Login 方法做了什么与我没有用 SetAuthCookie 方法做的不同?

显式转换为类型IMembershipProvier工作正常:

((IMembershipProvider)_facebookMembershipProvider).SetAuthCookie(user.id, false);
Run Code Online (Sandbox Code Playgroud)

我可能只是错过了一些基本的东西。谢谢参观。

更新

在回答 Marks 问题时,传递给该SetAuthCookie方法的第一个参数来自一个dynamic对象。

dynamic user = _authorizeUserCommand.Invoke(_authorizeUserParams);
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 5

诅咒dynamic(评论)!动态出血。尤其是,一旦涉及dynamic到一个表达式,整个事情就按照dynamic规则进行,这会在许多点上引入细微的变化。

我的建议:首先解决价值:

string id = user.id; // this has an implicit cast to string
_facebookMembershipProvider.SetAuthCookie(id, false);
Run Code Online (Sandbox Code Playgroud)

这应该可以正常工作。您还可以使用:

_facebookMembershipProvider.SetAuthCookie((string)user.id, false);
Run Code Online (Sandbox Code Playgroud)

因为显式转换应该dynamic在参数处结束表达式的一部分,所以调用不是 dynamic