【发布时间】:2023-03-07 08:05:01
【问题描述】:
我有两种扩展方法:
public static class ExtensionMethods
{
public static string GetClientIpAddress(this HttpRequestBase request)
{
// ...
}
public static string GetClientIpAddress(this HttpRequestMessage request)
{
// ...
}
}
HttpRequestMessage 类位于 System.Net.Http 程序集中,HttpRequestBase 位于 System.Web 中(即在不同的程序集中)。 ExtensionMethods 类位于 ProjectA 中。
这个项目编译良好,没有问题。
然后我使用另一个项目中的第一种方法GetClientIpAddress(this HttpRequestBase request)(比如说ProjectB),如下所示:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
var sessionContext = DependencyResolver.Current.GetService<ISessionContext>();
// Call to GetClientIpAddress
sessionContext.ClientIpAddress =
filterContext.HttpContext.Request.GetClientIpAddress();
}
ProjectB 已经引用了System.Web,但是当我尝试编译它时,它会导致编译器错误:
类型“
System.Net.Http.HttpRequestMessage”在未引用的程序集中定义。您必须添加对程序集“System.Net.Http, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”的引用。
我不明白为什么要添加对System.Net.Http的引用。
编译器似乎尝试使用第二种方法GetClientIpAddress(this HttpRequestMessage request),这会导致缺少对程序集的引用。这是一个错误吗?
当我重命名第一个方法(即摆脱重载)时,一切都编译得很好。
【问题讨论】:
-
扩展方法可能使用了Web项目中未引用的某些程序集
-
在编译器可以看到所有类型的定义之前,它并不知道您打算调用第一个方法。它需要查看所有类型以执行重载解析
-
ProjectB 已经同时引用了 System.Net.Http 和 System.Web,所以不是这种情况。请参阅下面的编辑。
-
您忘记记录您的 .NET 框架目标。但是您选择 4.0 并且不恰当地将客户端配置文件用于您的 EXE 项目的可能性很高。将其更改为完整版,该版本还包括 System.Web
-
“编译器似乎尝试使用第二种方法......” - 不,正如我在第一条评论中试图指出的那样,它甚至没有走那么远。它在您的代码中找到了一个符号
GetClientIpAddress。现在必须确定您打算调用的方法。它找到了两个候选人。它现在需要确定它应该调用两个候选人中的哪一个。为了做到这一点,它需要了解 both 方法的所有参数类型,以便找出唯一的最佳方法,或者调用是否不明确等。如果它不理解第二种方法的参数类型。
标签: c# extension-methods c#-5.0