我有以下两个接口:
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)
诅咒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
。