当前位置:  开发笔记 > 编程语言 > 正文

是否可以在部分类中为属性添加属性?

如何解决《是否可以在部分类中为属性添加属性?》经验,为你挑选了2个好方法。

我不认为这是可能的,但由于我没有明确的MSDN清晰度,我觉得最好问一下.假设我们有一个类如下.

public partial class Hazaa
{
  public int Shazoo { get; set; }
}

然后,我想将Shazoo归为SuperCool, 我希望在另一个文件中这样做.由于我使用的是分部分类,我可以按如下方式添加新属性.

public partial class Hazaa
{
  [SuperCool]
  public int Wheee { get; set; }
}

但是我可以通过在后者中编写代码来归因第一个样本中声明的属性吗?我怀疑这是可能的,但我很乐意经过纠正.如果是这样,语法是什么?



1> Reza Aghaei..:

根据您的要求,您可以考虑使用以下选项:

MetadataType 属性

您可以通过这种方式注册的属性实际上不是您的类属性,但大多数框架使用它们就像您的类本机属性一样.

如果要添加数据注释属性,特别是作为ASP.NET MVC项目,您会发现这种方式很有帮助.

此外,对于其他Windows Forms不支持的框架,MetadataTypeAttribute您只需添加支持即可AssociatedMetadataTypeTypeDescriptionProvider.

解决方案不仅限于数据注释属性,您可以使用对您的库和框架有意义的所有类型的属性.

如何定义其他属性?

您可以创建一个元数据类,其中包含由适当属性修饰的原始类的属性,然后按MetadataType属性修饰分部类,并为原始类引入元数据类.

如何看待这些属性的影响?

框架就像ASP.NET MVC使用它们在原始类中定义的那些属性一样.

此外,您可以AssociatedMetadataTypeTypeDescriptionProvider为其他框架或组件注册为原始类型的提供程序,TypeDescriptor以便获取有关您的类型的信息.

他们真的是我的阶级属性吗?

请注意,这样一来,属性真的不属于你原来的班,但对于大多数的框架,像ASP.NET MVCWindows Forms在使用TypeDescriptor以获得有关类型的信息,他们像你的类原始属性.

因此,如果您想使用反射获取属性的属性,则无法看到它们,但如果使用TypeDescriptor机制,则可以看到它们.

一个例子

哈扎班:

public partial class Hazaa
{
    public int Shazoo { get; set; }
}

HazaaMetadata类

[MetadataType(typeof(HazaaMetadata))]
public partial class Hazaa
{
}

public class HazaaMetadata
{
    [DisplayName("Shazoo Name")]
    public int Shazoo { get; set; }
}

ASP.NET MVC用法

你不需要做任何其他事情来做这项DisplayName工作,你可以简单地使用Html.LabelforHtml.DisplayNameFor看到影响.它会将"Shazoo Name"显示为标签文本.

Windows窗体用法

您的应用程序中的某些位置(如表单加载,main,...)以这种方式注册提供程序:

var provider = new AssociatedMetadataTypeTypeDescriptionProvider(typeof(Hazaa));
TypeDescriptor.AddProvider(provider, typeof(Hazaa));

因此,您将看到PropertyGridDataGridView使用"Shazoo Name"作为属性和列标题的标题.



2> angry person..:

不,你不能.

您只能将属性附加到您在那里声明的成员,然后,除非该成员也被声明为部分(以便您可以在其他地方重新实现),您不能将属性附加到在另一个部分文件中声明的成员.

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