【问题标题】:How to reinitialize a HashSet partial class in mvc?如何在 mvc 中重新初始化 HashSet 部分类?
【发布时间】:2017-06-21 11:05:17
【问题描述】:

我有以下由 mvc 使用数据库优先方法生成的部分类。 如何删除重新初始化 hashset 类以便我可以为其设置默认值?

mvc生成的原始类

 public partial class GeneratedClass
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public GeneratedClass()
    {
        this.GeneratedClass= new HashSet<GeneratedClass>();

    }}

我的数据注释部分类

[MetadataType(typeof(GeneratedClassAttribute))]
public partial class GeneratedClass
{
    public GeneratedClass()
    {
        MyPropertyValue = "default value";
    }
}

错误抛出

严重性代码描述项目文件行抑制状态 错误 CS0121 调用在以下方法或属性之间不明确:“GeneratedClass”和“GeneratedClass”

更新的工作代码

感谢 Tetsuya Yamamoto 指出创建 2 个具有相同参数的构造函数。所以我添加了一个虚拟参数并对其进行了轰炸。

 public GeneratedClass(string dummyValue="")

工作 2 通过柯克沃尔

使用OnCreate

【问题讨论】:

  • 部分类将编译为单个类 - 您在同一个类中声明了 2 个没有参数但内容不同的构造函数(可能存在命名冲突)。删除第二个构造函数,看看它是否有效,还可以查看关于部分类的 MSDN 文档 => msdn.microsoft.com/en-us/library/wa80x488.aspx.
  • 它们在不同的文件中。因为我不想更改系统生成的文件/代码,因此我创建了另一个部分类来添加元数据类型,如[Display(Name = "Greeting")] [Required(ErrorMessage = "{0} is required.")] 删除第二个构造函数将起作用,但我需要设置默认值,因此我需要它。

标签: c# asp.net-mvc


【解决方案1】:

正如 Tetsuya 在他的评论中所描述的,部分类主要是用于将单个类的实现拆分为多个文件的语法糖。因此,除了一些特定的扩展点(基本上是部分方法)之外,您不能在两个文件中声明具有相同名称的成员。

为了澄清,(通常生成的)类可以定义“部分”方法:

partial void Foo();

但除非该成员明确支持partial 修饰符,否则您不能在多个文件中声明该成员。我不确定您对生成的构造函数的控制程度如何,但理想情况下它将定义一个 OnCreated 部分方法,如下所示:

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public GeneratedClass()
{
    this.GeneratedClass= new HashSet<GeneratedClass>();
    OnCreated();
}

partial void OnCreated();

然后在您的“数据注释部分类”中,您将实现 OnCreated 部分方法:

private void OnCreated()
{
    MyPropertyValue = "default value";
}

现在操作的顺序很清楚了。 (如果实际上支持您的原始语法,应该在另一个构造函数之前调用哪个构造函数?)实际的构造函数执行,并将任何后续初始化委托给部分方法(允许未实现)。

【讨论】:

  • OnCreated 似乎更优雅。采用并有效。谢谢柯克沃尔
猜你喜欢
  • 2012-10-30
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
相关资源
最近更新 更多