gpt4 book ai didi

c# - 自定义属性的构造函数如何采用可选参数

转载 作者:太空宇宙 更新时间:2023-11-03 21:41:50 24 4
gpt4 key购买 nike

大家好,我在互联网上浏览自定义属性。我掌握了这个概念,但是,惊讶和困惑地看到他们通过属性类的构造函数设置属性值作为参数,而不是从构造函数中获取任何参数作为值。请阐明核​​心概念。

[DeBugInfo(45, "Zara Ali", "12/8/2012", **Message = "Return type mismatch"**)]
//like the Message here.

public class DeBugInfo : System.Attribute
{
private int bugNo;
private string developer;
private string lastReview;
public string message;
public DeBugInfo(int bg, string dev, string d)
{
this.bugNo = bg;
this.developer = dev;
this.lastReview = d;
}
public int BugNo
{
get
{
return bugNo;
}

public string Developer
{
get
{
return developer;
}
}
public string LastReview
{
get
{
return lastReview;
}

public string Message
{
get
{
return message;
}
set
{
message = value;
}
}




//////////////////////////

最佳答案

属性语法……与常规 C# 代码有点不同。在常规 C# 中,如果您手动创建该对象,那将类似于对象初始值设定项:

var obj = new DeBugInfo(45, "Zara Ali", "12/8/2012") {
Message = "Return type mismatch"
};

然而,在现实中,属性并没有真正实例化,至少在绝对需要它们之前是这样。属性实际上是标记到 IL 中的原始元数据,包括:

  • 构造函数 token
  • 构造函数的参数,由简单值组成
  • 其他属性/字段分配映射和相应的简单值

您实际上可以检查所有这些信息,而无需实际创建该类型的实例。但是,如果您使用 Attribute.GetAttributes 等,它会弄清楚它代表什么,并在运行时应用构造函数和映射。

一个完整的例子:

using System;

class DeBugInfoAttribute : Attribute
{
public string Message { get; set; }
public DeBugInfoAttribute(int i, string j, string k)
{
// to show we never get here!
throw new NotImplementedException();
}
}

[DeBugInfo(45, "Zara Ali", "12/8/2012", Message = "Return type mismatch")]
static class Program
{
static void Main()
{
// this doesn't create the attribute, so no exception
foreach (var data in typeof(Program).GetCustomAttributesData())
{
Console.WriteLine(data.AttributeType.Name);
var parameters = data.Constructor.GetParameters();
int i = 0;
foreach (var arg in data.ConstructorArguments)
{
Console.WriteLine("{0}: {1}",
parameters[i++].Name,
arg.Value);
}
foreach (var binding in data.NamedArguments)
{
Console.WriteLine("{0}: {1}",
binding.MemberInfo.Name,
binding.TypedValue);
}
}
// but this does: BOOM!
var attribs = Attribute.GetCustomAttributes(typeof(Program));
}
}

关于c# - 自定义属性的构造函数如何采用可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18982283/

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