我有以下两个接口:
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);
答案 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
。