我可以从另一个分类中调用一个分部类中定义的函数。可能吗?

时间:2010-01-05 11:57:09

标签: c# asp.net partial-classes

我为网页创建了两个部分类。

现在我已经给出了一个函数的定义,比如我在调用OnSubmit事件按钮时调用submit()。

但是这个函数没有被调用,程序不会编译,因为它无法搜索函数的定义,函数的定义是在另一个分类中定义的。是否可以调用此函数,或者我必须在我调用它的同一文件中给出函数的定义

例如

<%@ Page Language="C#" MasterPageFile="~/Master Pages/LeftMenu.master" AutoEventWireup="true" CodeFile="Registration.aspx.cs" Inherits="Web_Pages_Authentication_Login_Management_Registration" Title="Registration" StylesheetTheme="Default Theme 1"  %>

Registration.aspx.cs

public partial class Web_Pages_Authentication_Login_Management_Registration : System.Web.UI.Page
{
    private string firstName;
    private string lastName;
    private string userName;
    private string userPassword;
    private string primaryEmail;
protected void btnSubmit_Click(object sender, EventArgs e)
    {
       Display();
    }
}

Registration_Database.cs

   public partial class Web_Pages_Authentication_Login_Management_Registration 
    {
       const string dbFirstName = "@FirstName";
       const string dbLastName = "@LastName";
       const string dbUserName= "@UserName";
       const string dbUserPassword = "@UserPassword";
       const string dbPrimaryEmail = "@PrimaryEmail";  

       void Display()
          {
              firstName="XYZ"; //This variable is not accessible when i put both files in different directories
          }
    }

我收到以下错误

Error   1   'Web_Pages_Authentication_Login_Management_Registration' does not contain a definition for 'Display' and no extension method 'Display' accepting a first argument of type 'Web_Pages_Authentication_Login_Management_Registration' could be found (are you missing a using directive or an assembly reference?) C:\Documents and Settings\Administrator\Desktop\Online Test\Web Pages\Authentication\Login Management\Registration.aspx.cs  78  20  C:\...\Online Test\

Registration.aspx,Registration.aspx.cs,Registration_Database.cs是三个不在App_Code文件夹中但只属于一个文件夹的文件,其中Registration.aspx.cs,Registration_Database.cs是部分类和Registration.aspx是我的设计文件。 Plz让我知道你是否想知道更多关于我的问题的信息

我没有使用DLL文件。没有预编译的代码

5 个答案:

答案 0 :(得分:5)

我认为您遇到的问题是因为您的网站是dynamically compiled,而不是预编译的网络应用程序。

首次访问ASP.NET页面时,编译器只会查看代码隐藏文件,并且不会搜索所有其他.cs文件以获取同一类的可能额外代码。因此,它永远不会看到display()的实现,这反过来导致文件后面的代码无法编译。

我肯定不会将这样的方法用于您似乎想要做的事情,但您可以定义一个派生自System.Web.UI.Page的自定义类,并让您的实际页面派生自新类。对于动态编译的网站,类定义必须在App_Code

Registration.aspx.cs:

public partial class Web_Pages_Authentication_Login_Management_Registration : MyPage
{
    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        Display();
    }
}

App_Code文件\ MyPage.cs:

public class MyPage : System.Web.UI.Page
{
    protected void Display()
    {
        // ...
    }
}

在任何情况下:您当然不应该像使用静态变量一样使用静态变量,如果多人同时使用您的网站,这将导致问题。坦率地说,你的榜样对我来说没什么意义。也许如果我们有更多关于你想要完成什么的信息,我们可以提供一种最佳实践方法来实现它。

请注意,在您的示例中,将第二个文件放在App_Code目录中将无法使其正常工作。这只会导致两个类具有完全相同的类名(当然命名空间匹配)。它真的不喜欢那样:))

答案 1 :(得分:1)

当然可以。与类中的每个其他方法(部分或非部分)一样,您可以通过ClassName.MethodName()调用静态方法,或者通过非静态方法调用类的实例,并调用instanceName.MethodName()

编辑:对不起,我最初没有看到你的例子。

那应该有用。部分类在文件中拆分,但它被编译为一个类。因此,同一部分类的第二部分可以访问另一部分中定义的私有成员而没有任何问题。

答案 2 :(得分:1)

是的,可以在(部分)类上调用方法。

部分类只是某些语言的一个特性(例如C#) - 它们在IL中不存在,因为它们被一起编译成一个类。

然而,它有时会很棘手,因为部分类声明必须完全相同才能发生这种合并。 包含命名空间,因此这可能是您的问题。

作为一个例子,这将导致一个类:

namespace MyNamespace
{
    public partial class MyClass { }

    public partial class MyClass { }
}

结果类是MyNamespace.MyClass。但是,这将导致两个不同的类:

namespace MyNamespace
{
    public partial class MyClass
    {
        public void MyMethod();
    }
}

namespace MyOtherNamespace
{
    public partial class MyClass { }
}

这将产生两个类:MyNamespace.MyClass和MyOtherNamespace.MyClass。在这种情况下,从MyOtherNamespace.MyClass调用this.MyMethod将不起作用。

答案 3 :(得分:1)

如果我正确理解您的问题,您有两个文件包含SAME类的部分类定义。对?他们不是两个不同的班级?

如果两个文件都属于同一个类,那么您应确保它们都在同一名称空间中定义,并且类名拼写完全相同。如果名称匹配,那么这应该有用。

如果您的部分类定义了两个不同的类,则应用与常规类相同的规则。要引用另一个类的元文件,该方法必须是公共的,并且您需要引用该类的实例,或者该方法必须是静态的。

答案 4 :(得分:1)

这应该没问题。如果你愿意,你可以使用部分方法形式化;在一个文件中声明部分存根,并在另一个文件中实现它。这将快速识别您是否有两个类或一个类,并将突出显示实现未定义的部分方法的尝试:

partial class Foo
{
    partial void Bar(string someArg);
    // other code that uses Bar(s)
}
partial class Foo
{
    partial void Bar(string someArg)
    {
        Console.WriteLine(someArg);
    }
}

请注意,partial方法必须是非公开的,并且不能包含out或非空返回类型。