Reputation: 53991
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);
Upvotes: 3
Views: 2567
Reputation: 1062725
The curse of dynamic
(comments)! Dynamic bleeds. In particular, as soon as you involve dynamic
in an expression, the entire thing is performed with dynamic
rules, which introduces subtle changes into a number of points.
My advice: resolve the value first:
string id = user.id; // this has an implicit cast to string
_facebookMembershipProvider.SetAuthCookie(id, false);
which should work fine. You could also use:
_facebookMembershipProvider.SetAuthCookie((string)user.id, false);
since the explicit cast should end the dynamic
part of the expression at the argument, so the invoke is not dynamic
.
Upvotes: 5