修改/添加到 C# 部分 类

Modifying / Adding to C# Partial Classes

我的 C# 项目中有部分 class,即从 Entity Framework 自动生成的代码。现在我想修改或添加一些功能、属性或方法到 class。我在项目的 EntityFrameworkModel.tt\Author.cs 选项卡下有自动生成的 class 代码,而其他相关的 class 代码在另一个文件夹中,即同一项目中的 GraphData

我也知道部分 classes 的名称应该相同,而文件名可能不同或相同。我做了同样的事情,但是当我将 Author.cs 的对象定义为:

protected override EvoObject ConvertCPV(Author _author)  
{
    if (_author.???)  
    {
        //...  
    }
}

我无法访问 GraphData\Author.cs 中定义的方法(示例代码中的问号),而 EntityFrameworkModel.tt\Author.cs 中定义的属性只能访问。

我在这里附加了 Solution Explorer 图片:

如何从两个 classes 访问属性和方法?

  • 在 EntityFrameworkModel.tt 之外创建您自己的 class - 将其命名为 Author.cs,使 class 部分。

partial 的整个想法是让代码生成器不关心你的代码。你修改了一个生成的 class,下一次重新生成会杀死更改。

I did same but when I defined the object for Author.cs as:

啊,不,你没有,因为你声称你的定义是:

protected override EvoObject ConvertCPV(Author _author)

未定义对象。

I can't access the methods defined in GraphData\Author.cs

因为命名空间?检查命名空间 - 当它们属于与 EntityFrameworkModel.tt

相同的命名空间时,将它们放在子文件夹中是不好的

whereas the properties defined in EntityFrameworkModel.tt\Author.cs are only accessible.

部分 classes 不允许更改另一个部分 - 暂时不允许,考虑替换语法。

我在一个项目中也有类似的设置。

为了保持整洁,我还有一些文件夹用于放置某些部分 classes,您只需要确保命名空间与自动生成的 class.

相同

当您向文件夹添加新 class 时,命名空间将自动包含文件夹的名称 - 您可以从命名空间中删除文件夹名称 - 在这种情况下您应该只有项目名称.

如果命名空间不同,则部分 class 不属于同一 class。 这就是您无法访问的原因新 functions/Properties.

此外,即使您的文件名和 class 名称可以不同,但​​最好保持相同 - 如果文件具有相同的 class 将更容易找到名字.

查看 https://msdn.microsoft.com/en-us/library/wa80x488.aspx

它说 "The partial keyword indicates that other parts of the class, struct, or interface can be defined in the namespace." 它没有明确说明这一点,但这意味着 class 的部分定义必须在 same 命名空间中声明.项目中的哪些文件包含 classes 或它们位于什么文件夹中并不重要。

using System;

namespace DemoConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            SameNamespace.PartialClass.MethodOne();
            SameNamespace.PartialClass.MethodTwo();
            DifferentNamespace.PartialClass.MethodThree();
        }
    }
}

namespace SameNamespace
{
    public partial class PartialClass
    {
        public static void MethodOne()
        {
            Console.WriteLine("Method One.");
        }
    }

    public partial class PartialClass
    {
        public static void MethodTwo()
        {
            Console.WriteLine("Method Two.");
        }
    }
}

namespace DifferentNamespace
{
    public partial class PartialClass
    {
        public static void MethodThree()
        {
            Console.WriteLine("Method Three.");
        }
    }
}