接口不包含方法的定义

时间:2012-03-23 09:48:41

标签: c# interface

我有以下两个接口:

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'的定义

对于我没有使用SetAuthCookie方法执行的Login方法,我的做法有何不同?

明确地转换为类型IMembershipProvier可以正常工作:

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

我可能只是错过了一些不成熟的东西。谢谢你看看。

更新

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

dynamic user = _authorizeUserCommand.Invoke(_authorizeUserParams);

1 个答案:

答案 0 :(得分:4)

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