gpt4 book ai didi

c# - .NET 中的属性是什么?

转载 作者:IT王子 更新时间:2023-10-29 03:29:41 25 4
gpt4 key购买 nike

.NET 中的属性是什么,它们有什么用处,我如何创建自己的属性?

最佳答案

元数据。有关您的对象/方法/属性的数据。

例如,我可能会声明一个名为 DisplayOrder 的属性,这样我就可以轻松控制属性在 UI 中的显示顺序。然后我可以将它附加到一个类并编写一些 GUI 组件来提取属性并对 UI 元素进行适当排序。

public class DisplayWrapper
{
private UnderlyingClass underlyingObject;

public DisplayWrapper(UnderlyingClass u)
{
underlyingObject = u;
}

[DisplayOrder(1)]
public int SomeInt
{
get
{
return underlyingObject .SomeInt;
}
}

[DisplayOrder(2)]
public DateTime SomeDate
{
get
{
return underlyingObject .SomeDate;
}
}
}

从而确保在使用我的自定义 GUI 组件时,SomeInt 始终显示在 SomeDate 之前。

但是,您会发现它们最常用于直接编码环境之外。例如,Windows Designer 广泛使用它们,因此它知道如何处理定制对象。像这样使用 BrowsableAttribute:

[Browsable(false)]
public SomeCustomType DontShowThisInTheDesigner
{
get{/*do something*/}
}

例如,告诉设计者不要在设计时将其列在“属性”窗口的可用属性中。

还可以将它们用于代码生成、预编译操作(例如 Post-Sharp)或运行时操作(例如 Reflection.Emit)。例如,您可以编写一些用于分析的代码,透明地包装您的代码进行的每个调用并对其计时。您可以通过放置在特定方法上的属性“选择退出”计时。

public void SomeProfilingMethod(MethodInfo targetMethod, object target, params object[] args)
{
bool time = true;
foreach (Attribute a in target.GetCustomAttributes())
{
if (a.GetType() is NoTimingAttribute)
{
time = false;
break;
}
}
if (time)
{
StopWatch stopWatch = new StopWatch();
stopWatch.Start();
targetMethod.Invoke(target, args);
stopWatch.Stop();
HandleTimingOutput(targetMethod, stopWatch.Duration);
}
else
{
targetMethod.Invoke(target, args);
}
}

声明它们很容易,只需创建一个继承自 Attribute 的类即可。

public class DisplayOrderAttribute : Attribute
{
private int order;

public DisplayOrderAttribute(int order)
{
this.order = order;
}

public int Order
{
get { return order; }
}
}

请记住,当您使用属性时,您可以省略后缀“attribute”,编译器会为您添加它。

注意: 属性本身不会做任何事情 - 需要一些其他代码来使用它们。有时该代码是为您编写的,但有时您必须自己编写。例如,C# 编译器关心一些和某些框架框架使用一些(例如,NUnit 在加载程序集时查找类上的 [TestFixture] 和测试方法上的 [Test])。
因此,在创建您自己的自定义属性时请注意,它根本不会影响您的代码的行为。您需要编写另一部分来检查属性(通过反射)并对其进行操作。

关于c# - .NET 中的属性是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20346/

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