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);
The curse of
dynamic
(comments)! Dynamic bleeds. In particular, as soon as you involvedynamic
in an expression, the entire thing is performed withdynamic
rules, which introduces subtle changes into a number of points.My advice: resolve the value first:
which should work fine. You could also use:
since the explicit cast should end the
dynamic
part of the expression at the argument, so the invoke is notdynamic
.