【问题标题】:How can I use attributes on a property defined in the other half of a partial class?如何在部分类的另一半中定义的属性上使用属性?
【发布时间】:2012-04-16 12:56:51
【问题描述】:

我有一个通过导入包含类似这样(缩写)的 Web 服务而自动生成的类:

[System.Runtime.Serialization.DataMemberAttribute()]
public System.DateTime StartDate 
{
    get 
    {
        return this.StartDateField;
    }
    set { /* implementation prop changed */ }
}

我想给这个成员添加一个 MVC 格式属性。所以在另一个包含相同partial class 定义的文件中,我想做类似以下的事情(这是非法的):

[DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)] 
public DateTime StartDate;

部分方法在这里没有用,因为部分方法必须是私有的,具有 void 返回类型,必须是方法等。

我该如何装饰这个成员?

【问题讨论】:

  • 第二个代码 sn-p 是否应该定义您的第一个 sn-p 中的 StartDate 属性使用的 StartDateField
  • 您应该使用MetadataType 属性和另一个镜像生成的类的类,而不是使用部分类来装饰生成的代码。 (Related Question)
  • @M.Babcock:不,第二个 sn-p 与第一个同名。以这种方式为自动生成的类添加扩展是很常见的,但通常你只添加属性/方法,你不会重新定义它们(afaik,你不能)。
  • 正确。这就是我的第二条评论所针对的内容。
  • 看看这个,我已经在这里回答了这个问题stackoverflow.com/a/24757520/3050647

标签: c# asp.net-mvc attributes partial-classes


【解决方案1】:

您可以像这样使用MetadataType 属性:

[MetadataType(typeof(MyClass_Validation))]     
public partial class MyClass
{} 

public class MyClass_Validation     
{     
   [DisplayFormat(...)] 
   public DateTime StartDate { get; set; } 
}

【讨论】:

  • 你的意思是说这里使用MetadataType强制编译器将相似签名的属性添加到部分类中的对应签名中?如果可行的话,听起来很棒。
  • 是的,例如,使用MetadataType 属性来定义一个类型,该类型将包含自动生成的类的属性。在不同的类中指定验证属性也是一个好习惯
  • @Abel - 是的,这是专门为这种情况设计的。匹配是在名称上,而不是在签名上。
  • 像魅力一样工作。感谢@Henk 的更新,我会小心重载。虽然在 TCPL 中找不到任何此类内容,但其中指定了一些特殊属性。
猜你喜欢
  • 2011-04-16
  • 2020-01-06
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
相关资源
最近更新 更多