【问题标题】:C# partial class and the get accessorC# 部分类和 get 访问器
【发布时间】:2013-04-17 18:09:42
【问题描述】:

基于 Entity Framework 实体,我为其中一个创建了部分类。问题是,我想在返回 ContentValue 之前添加一些代码。但它不起作用 -

[MetadataType(typeof(ToolTip_Meta))]
public partial class Tooltip
{
    ..some methods etc
}

public class ToolTip_Meta
{
    [Required]
    public string ContentValue
    {
        get
        {
            if (!string.IsNullOrEmpty(this.ContentValue))
                return this.ContentValue.Replace("\n", "<br/>").Replace("\r", "").Replace("\r", "").Replace("'", "\\'").Replace("\"", "&quot;");
            return this.ContentValue;
        }
        set { ContentValue = value; }
    }
}

当我在项目中的某个地方想要获取 ContentValue 属性值时,我得到了未更改的字符串,我没有进入 get 访问器。如何解决?

【问题讨论】:

  • 您能否创建并使用以ContentValue 作为支持者的新属性?
  • 您是从 ContentValue 的 get 属性中调用 ContentValue 的 get 属性吗?这应该 d=肯定不行
  • 可以,但我想确保程序员每次获取 ContentValue 属性值时,都会得到更改后的字符串
  • 也许最好将模型中的属性标记为内部属性并在部分类中围绕它包装一个公共属性(稍微不同的名称),只有在它位于一个单独的程序集。
  • Silvermind > 基本 Tooltip 类是由实体框架设计器自动生成的,因此唯一的方法是使用部分类中的 ContentValue 属性做一些技巧

标签: c# partial-classes


【解决方案1】:

我认为这实际上与部分类或元数据无关。你的问题其实很简单。

if (!string.IsNullOrEmpty(this.ContentValue))

当您访问 this.ContentValue 时,它会调用 getter,然后再访问 this.ContentValue,后者会调用 getter...因此您将获得 StackOverflowException 或 OutOfMemoryException。

如果您没有遇到这两个错误之一,请更新您的问题以说明如何它不起作用。

【讨论】:

    【解决方案2】:

    在实体框架设计器中,将生成的属性的字段名称更改为ContentValueInternal,并将其标记为具有内部访问权限而不是公共的。这仍然可以映射到ContentValue 的数据库字段。

    然后,在您手动编码的部分类中,创建一个名为 ContentValue 的新公共属性,该属性具有您在问题中描述的逻辑,但在内部使用 ContentValueInternal 属性来存储实际值。

    【讨论】:

    • 听起来不错,但问题是每次更新 EF 模型时,每个程序员都必须记住将该属性更改为 ContentValueInternal。但有人可能会忘记这样做
    • 如果您只是在设计器中执行“从数据库更新模型”,它应该记住映射,因此您不必一直重置它们。如果您使用源代码控制,并且将 edmx 与源代码一起存储,那么每个程序员都应该使用相同的映射,因此不需要单独更改它。如果由于某种原因上述不成立,并且它被重置并且有人忘记更改它,那么编译器会抱怨,因为您将有一个部分类引用一个不存在的字段。因此,这足以提醒您修复它。
    猜你喜欢
    • 2012-10-03
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2019-05-25
    • 2014-10-13
    • 2016-05-16
    • 1970-01-01
    • 2017-05-31
    相关资源
    最近更新 更多