修改/添加到C#部分类

时间:2016-05-16 14:41:29

标签: c# entity-framework partial-classes self-modifying

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

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

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

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

我将Solution Explorer图片附加为:

enter image description here

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

3 个答案:

答案 0 :(得分:2)

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

为了保持整洁,我还有一些文件夹,我放置了某些部分类,你只需要确保命名空间与自动生成的类相同。

当您向文件夹添加新类时,命名空间将自动包含文件夹的名称 - 您只需从命名空间中删除文件夹名称 - 您应该在此方案中拥有项目名称。

如果命名空间不同,则部分类不属于同一个类。这就是您无法访问新函数/属性的原因。

此外,即使您的文件名和类名可能不同,最好保持它们相同 - 如果文件具有相同的名称,则更容易找到类。

答案 1 :(得分:0)

  • 在EntityFrameworkModel.tt之外创建自己的类 - 将其命名为Author.cs,使该类成为局部。

部分的整个想法是允许代码生成器不关心你的代码。在修改生成的类时,下一次重新生成会消除更改。

  

我做了同样的事情,但当我为Author.cs定义对象时:

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

  

受保护的覆盖EvoObject ConvertCPV(作者_author)

哪个不是定义对象。

  

我无法访问GraphData \ Author.cs

中定义的方法

因为命名空间?检查命名空间 - 当它们属于与EntityFrameworkModel.tt相同的命名空间时,将它们放在子文件夹中是不好的

  

而EntityFrameworkModel.tt \ Author.cs中定义的属性仅为   访问。

部分类不允许对另一部分进行更改 - 暂时不考虑替代语法。

答案 2 :(得分:0)

查看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."它没有明确说明这一点,但这意味着必须在相同的命名空间中声明类的部分定义。项目中的哪些文件包含类或它们所在的文件夹并不重要。

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