【问题标题】:Interface does not contain a definition for method接口不包含方法的定义
【发布时间】:2012-03-23 09:48:40
【问题描述】:

我有以下两个接口:

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

我在使用 Login 方法时所做的与使用 SetAuthCookie 方法不同的地方是什么?

显式转换为 IMembershipProvier 类型可以正常工作:

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

我可能只是错过了一些基本的东西。感谢您的观看。

更新

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

dynamic user = _authorizeUserCommand.Invoke(_authorizeUserParams);

【问题讨论】:

  • +1 难以置信。没有旧的 DLL 在您的机器周围敲打?会不会是 Resharper/类似的旧缓存?
  • 我在本地和我的外部服务器上遇到了同样的问题。我已删除并重新添加了对我的 UserManagement DLL 的引用。不过看起来可能是缓存问题。
  • 您是否在使用dynamic 之类的东西,或者任何装饰器平台,或类似的东西?任何元编程或 IoC/DI 堆栈?基本上,看起来有些代码(通常是元编程,通过 ILGenerator)试图错误地调用该方法。它听起来不像 C# 编译器会出错。
  • IFacebookMembershipProvider 接口在哪里?
  • 传递给 SetAuthCookie 方法的参数之一来自动态对象。 dynamic user = _authorizeUserCommand.Invoke(_authorizeUserParams);

标签: c# interface


【解决方案1】:

dynamic(cmets)的诅咒!动态出血。特别是,一旦您将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

【讨论】:

  • 优秀的标记。这样就解决了问题。非常感谢:)
  • @JamieDixon 那么用户 ID 是 dynamic 对象吗?
  • 是的。当 Mark 询问时,我将其添加到 cmets 中,并将其包含在问题中,以便将来的读者更清楚。
  • @Jamie 我很高兴我们能找到一个快速修复,但是:我无法确定这是否是 c# 动态绑定器中的错误;已在此处添加:stackoverflow.com/questions/9837472/…
  • 不错的一个。我会跟踪这个问题,看看会发生什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
  • 1970-01-01
相关资源
最近更新 更多