C# 自定义属性的行为与数据注释不同
我试图在控制台应用程序中创建一个自定义属性,但它不起作用。我的自定义属性从未被调用。我在这里找到了一个很好的例子 但对它的实施并不满意 我想知道数据注释在MVC中是如何工作的。我们不必单独称呼它 MVC是否在幕后调用这些数据注释属性 我希望创建一个自定义属性,我可以在任何类属性上使用它,就像数据注释属性一样。但是像上面的链接那样单独调用它并不是我想要的 以下是我尝试过的:C# 自定义属性的行为与数据注释不同,c#,asp.net-mvc,data-annotations,custom-attributes,C#,Asp.net Mvc,Data Annotations,Custom Attributes,我试图在控制台应用程序中创建一个自定义属性,但它不起作用。我的自定义属性从未被调用。我在这里找到了一个很好的例子 但对它的实施并不满意 我想知道数据注释在MVC中是如何工作的。我们不必单独称呼它 MVC是否在幕后调用这些数据注释属性 我希望创建一个自定义属性,我可以在任何类属性上使用它,就像数据注释属性一样。但是像上面的链接那样单独调用它并不是我想要的 以下是我尝试过的: using System; namespace AttributePractice { [AttributeUsa
using System;
namespace AttributePractice
{
[AttributeUsage(AttributeTargets.Property)]
public class CustomMessageAttribute : Attribute
{
public static readonly CustomMessageAttribute Default = new CustomMessageAttribute();
protected string Message { get; set; }
public CustomMessageAttribute() : this(string.Empty)
{
Console.WriteLine("Default message is empty");
}
public CustomMessageAttribute(string message)
{
Message = message;
}
public string MyMessage =>
Message;
public override bool Equals(object obj)
{
if (obj == this)
return true;
if (obj is CustomMessageAttribute customMessageAttribute)
return customMessageAttribute.Message == MyMessage;
return false;
}
public override int GetHashCode()
{
return MyMessage.GetHashCode();
}
public override bool IsDefaultAttribute()
{
return Equals(Default);
}
}
public class Person
{
//This never works
// I am looking to use this attribute anywhere without calling it
// separately , same like data annotations
[CustomMessage("Hello world")]
public string Name { get; set; }
public int Age { get; set; }
public void DisplayPerson()
{
Console.WriteLine(Name);
Console.WriteLine(Age);
}
}
internal static class Program
{
private static void Main(string[] args)
{
var personObj = new Person
{
Name = "Tom",
Age = 28
};
personObj.DisplayPerson();
}
}
}
有人能告诉我如何使自定义属性像数据注释一样工作吗?是的,如果您需要10个自定义属性,您应该创建10个单独的属性。属性本身不做任何事情。有些代码必须查找属性并对其进行处理。这就是数据注释的情况。MVC是否在幕后调用这些数据注释属性-是的。在渲染或验证模型时,它使用反射来检查模型的属性。谢谢!但我如何为我的控制台应用程序创建类似的反射或任何替代类呢。任何代码提示。如果不单独调用属性,则无法使用该属性。必须编写反射代码才能使用该属性。我建议您从上的文档开始,请尝试以下内容:''也许可以完成您的答案?@NetMage是的,谢谢您的解释。