当前位置:  开发笔记 > 大数据 > 正文

将属性与.net中的代码生成属性相关联

如何解决《将属性与.net中的代码生成属性相关联》经验,为你挑选了2个好方法。

我希望在.NET中的公共属性上设置一个属性,但是我无法访问explicit属性本身,因为这是在另一个文件中生成的代码.

我有这个领域:

public virtual string Name { get; set; }

我希望这样:

[ValidateNonEmpty("Name is required", ExecutionOrder = 1)]
public virtual string Name { get; set; }

我的类被标记为部分,但您不能拥有部分属性.我以为我正在使用MetadataType类,这是动态数据和数据注释的一个新功能,但我觉得它只能用于动态数据,这是真的吗?

引文:http : //blogs.oosterkamp.nl/blogs/jowen/archive/2008/10/16/metadatatype-attribute.aspx http://blogs.msdn.com/davidebb/archive/2008/06/16/dynamic -data-和最相关的元数据,class.aspx

有没有办法我可以设置这个属性(即使通过web.config!)而不触及代码生成的类?

提前谢谢,格雷厄姆



1> Marc Gravell..:

这是一个众所周知的滋扰; 您根本无法向生成的成员添加元数据.

这里有6个选项(按增加的顺序):

如果您拥有该属性,则可以针对该类声明它,例如:[ValidateNonEmpty("Name", "Name is required", ExecutionOrder = 1)]- 然后将多个属性添加到分部类定义

使用virtual/interface/etc方法来查询它,而不是通过属性

子类生成的类型; 覆盖或重新声明成员,添加元数据(真的很乱)

使用自定义TypeDescriptionProvider来提供动态元数据(很多很多工作) - 假设消费者尊重TypeDescriptor; 大多数与绑定相关的消费者都这样做,但是,例如,Expression(许多LINQ提供商使用)却没有

改变代码生成器/编写自己的代码

尝试扩展像PostSharp这样的东西来完成工作(我还没有办法做到这一点,但我很想知道你是否找到了办法!)

我通常使用第一个选项取得成功,除非它是系统定义的属性([DisplayName]等).如果[ValidateNonEmpty]由动态数据定义,那么您可能无法执行此操作.



2> 小智..:

由于生成的类是部分类,因此以下内容应该起作用:

    创建一个在其中声明了此属性的接口,并使用ValidateNonEmpty属性对其进行装饰.

    创建自己的与AutoGenerated类同名的部分类,并使此实现您刚刚创建的接口.

    现在应该使用该属性修饰该属性

例如:

// Decorate the properties with attributes as required
public interface IMyInterface
{
    [ValidateNonEmpty("Name is required")]
    string Name { get; set; }
}

// This is the partial class I created, that implements the interface
public partial class MyGeneratedClass : IMyInterface
{    
}

// This is the auto-generated class
public partial class MyGeneratedClass
{
    public virtual string Name { get; set; }
}

我从geekswithblogs得到了这个想法.

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有