当定义存在且“构建页面”工作时,“构建解决方案错误”类不包含xxx的定义

时间:2018-10-26 07:15:28

标签: c# asp.net .net visual-studio webforms

我有一个名为“报告”的课程 像这样声明,但没有特定的名称空间,将其声明为全局名称空间。

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。

修改 这是构建订单屏幕截图 enter image description here

我还检查了构建订单的依赖性。

2 个答案:

答案 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");
}

如果您想使此类可供您的视图使用,则有两种选择:

  1. 使用命名空间在Web.config中声明它:

    <pages> <namespaces> <add namespace="MyApplication.Reports"/> </namespaces> </pages>

然后,您可以直接在视图中访问该命名空间中的所有类:

<% Report report = new Report(); %>

<% if(report.CheckIfReportAccess("SomeReport") == "1") { %>
    <div>
        SomeReport has access
    </div>
<% } %>
  1. 直接将其导入您的视图中:

<%@ 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类的程序集在构建中的列出早于所有包含对该类的引用的程序集。