gpt4 book ai didi

c# - 是否可以向部分类中的属性添加属性?

转载 作者:可可西里 更新时间:2023-11-01 08:35:02 26 4
gpt4 key购买 nike

我不认为这是可能的,但由于我没有从 MSDN 得到明确的说明,我觉得最好问问。假设我们有一个类如下。

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

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

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

但是我可以通过在第一个示例中编写代码来为第一个示例中声明的属性赋予属性吗?我怀疑这是可能的,但我很乐意接受纠正。如果是这样,语法是什么?

最佳答案

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

注意: 您可以通过这种方式注册的属性实际上并不是您的类属性,但大多数框架(如 ASP.NET MVC)都将它们用作您的类 native 属性。

如果你想添加数据注释属性,特别是在 ASP.NET MVC 项目中,你会发现这种方式很有帮助。

对于不支持 MetadataTypeAttribute 的其他框架,例如 Windows Forms,您也可以使用 AssociatedMetadataTypeTypeDescriptionProvider 添加支持。 .

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

如何定义额外的属性?

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

如何查看那些属性的影响?

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

您也可以注册AssociatedMetadataTypeTypeDescriptionProvider作为可能要使用的其他框架或组件的原始类型的提供者 TypeDescriptor获取有关您的类型的信息。

它们真的是我的职业属性吗?

请注意,这样,属性确实不属于您的原始类,但对于大多数框架,如 ASP.NET MVCWindows Forms 来说,使用 TypeDescriptor 获取有关类型的信息,它们就像您的类的原始属性一样。

所以如果你想使用反射获取属性的属性,你看不到它们,但如果你使用 TypeDescriptor 机制,你可以看到它们。

一个例子

Hazaa 类:

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 名称”显示为标签文本。

Windows 窗体使用

在您的应用程序中的某些地方(例如表单加载、主...)以这种方式注册提供者:

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

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

关于c# - 是否可以向部分类中的属性添加属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34480940/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com