我有一个名为“报告”的课程 像这样声明,但没有特定的名称空间,将其声明为全局名称空间。
using system;
//and other namespaces
public class Report
{
public string CheckIfReportAccess(string name)
{
//logic here
}
}
并且我在webform页面加载方法中使用了Report
这样的类方法。
global::Report report = new global::Report();
if (!report.CheckIfReportAccess("xxx"))
{
//logic here.
}
问题是我构建解决方案时发生了错误
错误:'Report'不包含'CheckIfReportAccess'的定义,并且找不到扩展方法'CheckIfReportAccess'接受类型为'Report'的第一个参数(您是否缺少using指令?还是程序集引用?)。
我现在正在做什么,我只是进入菜单Build > Build Page
并重建解决方案。解决方案的构建和工作。
但是这是一个非常大的问题,它非常耗时,有数百个此类的引用,并且每次我构建解决方案时都会出现它,然后构建页面重建解决方案即可。
我正在使用Visual Studio 2017。
我还检查了构建订单的依赖性。
答案 0 :(得分:3)
您应该为类分配一个名称空间,而不是使用全局名称空间,例如,如果您的应用程序名为“ MyApplication”,则可以创建一个文件夹“ Reports”,然后在其中创建您的类,如下所示:
namespace MyApplication.Reports
{
public class Report
{
public string CheckIfReportAccess(string name)
{
//logic here
}
}
}
如果您想在后面的Page代码中使用它,您应该能够像现在一样简单地引用名称空间:
using MyApplication.Reports;
[...]
protected void Page_Load(object sender, EventArgs e)
{
Report report = new Report();
report.CheckIfReportAccess("SomeReport");
}
如果您想使此类可供您的视图使用,则有两种选择:
使用命名空间在Web.config中声明它:
<pages>
<namespaces>
<add namespace="MyApplication.Reports"/>
</namespaces>
</pages>
然后,您可以直接在视图中访问该命名空间中的所有类:
<% Report report = new Report(); %>
<% if(report.CheckIfReportAccess("SomeReport") == "1") { %>
<div>
SomeReport has access
</div>
<% } %>
<%@ Import Namespace="MyApplication.Reports" %>
修改
如果不能如上所述使用名称空间,而需要对所有类使用全局名称空间,则可以在遇到问题时考虑更改类名称,例如,而不是Report
试试MyReport
,看能否解决问题。
编辑2
如果由于项目限制(无论如何我都觉得很奇怪)而不能修改现有的类,则可以始终使用所需的名称空间和名称创建一个新类,并从有问题的类中继承该类:
namespace MyApplication.Reports
{
public class MyReport : Report
{
}
}
然后在视图中使用“ MyReport”,并且不要忘记如上所述在Web.Config中注册名称空间。
答案 1 :(得分:2)
从对问题的评论以及@Isma对问题的详细答复中,听起来好像您的项目构建顺序可能有问题。具体来说:
首先构建解决方案,然后在错误页面“构建”页面上出现错误,然后再次构建解决方案。这是我现在的工作,但非常痛苦。
构建解决方案时,文件将输出到用于构建配置的相应bin文件夹中。如果一次失败,然后第二次成功,则向我提示第一次构建失败,因为包含Report
类的程序集在引用Report
类的项目时尚未创建建成。第二次运行构建时,已经创建了程序集(在第一个构建中的某个时刻,但是在需要之后),因此不再出现问题。
您可以按照以下问题的答案中的说明查看和更改构建项目的顺序:Visual Studio 2010: How to enforce build order of projects in a solution?
您需要确保包含Report
类的程序集在构建中的列出早于所有包含对该类的引用的程序集。