C#中partial的用法

237 阅读2分钟

在 C# 中,partial 关键字用于将一个类、结构体、接口或方法分割成多个部分,允许你在不同的文件中定义同一个实体的不同部分。这在一些情况下非常有用,例如当你需要将一个类的定义分散在多个文件中,或者与自动生成的代码一起工作时。下面是 partial 关键字的一些用法:

1 分割类或结构体:

// File1.cs
public partial class MyClass
{
    public void Method1() { }
}

// File2.cs
public partial class MyClass
{
    public void Method2() { }
}

在这个例子中,MyClass 类被分割成两个部分,分别在不同的文件中定义。编译器会将它们合并成一个完整的类。

2 分割接口:

// File1.cs
public partial interface IMyInterface
{
    void Method1();
}

// File2.cs
public partial interface IMyInterface
{
    void Method2();
}

同样,接口也可以使用 partial 关键字进行分割。

3 部分类中的方法:

public partial class MyClass
{
    public void Method1() { }
}

public partial class MyClass
{
    public void Method2() { }
}

你可以在同一个类中的多个部分中定义不同的方法。

4 自动生成的代码:

partial 也常用于与代码生成工具一起使用,例如 Entity Framework 自动生成的代码:

// 自动生成的代码,你不应该直接编辑它
public partial class MyEntity
{
    public int Id { get; set; }
}

// 手动编写的代码
public partial class MyEntity
{
    public void CustomMethod() { }
}

5 修饰方法用法

例如:方法MapNavProps

  public partial class TestMap : EntityTypeConfiguration<Test>
    {
        partial void MapNavProps()
        {
            this.HasRequired(t => t.Country).WithMany().HasForeignKey(t => t.CountryID);
        }
    }

    public partial class TestMap : EntityTypeConfiguration<Test>
    {
         public TestMap()
         {
            this.ToTable("Test");
            this.Property(t => t.AreaID).HasColumnName("AreaID");
            this.HasKey(t => t.PortID);
            this.Property(t => t.PortID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
            this.Property(t => t.PortID).HasColumnName("PortID");
            this.Property(t => t.PortName).HasColumnName("PortName");
            MapNavProps();
        }
        partial void MapNavProps();
    }

这样,你可以在生成的代码和手动编写的代码之间保持分离,而不会因为重新生成代码而丢失手动添加的内容。

总之,partial 关键字允许你将一个实体的定义分布在多个文件中,以提高代码的组织性和可维护性。在使用 partial 时,需要确保每个部分的访问修饰符、方法签名等保持一致,以便编译器能够正确地合并它们。