C# 自定义属性的行为与数据注释不同

C# 自定义属性的行为与数据注释不同,c#,asp.net-mvc,data-annotations,custom-attributes,C#,Asp.net Mvc,Data Annotations,Custom Attributes,我试图在控制台应用程序中创建一个自定义属性,但它不起作用。我的自定义属性从未被调用。我在这里找到了一个很好的例子 但对它的实施并不满意 我想知道数据注释在MVC中是如何工作的。我们不必单独称呼它 MVC是否在幕后调用这些数据注释属性 我希望创建一个自定义属性,我可以在任何类属性上使用它,就像数据注释属性一样。但是像上面的链接那样单独调用它并不是我想要的 以下是我尝试过的: using System; namespace AttributePractice { [AttributeUsa

我试图在控制台应用程序中创建一个自定义属性,但它不起作用。我的自定义属性从未被调用。我在这里找到了一个很好的例子 但对它的实施并不满意

我想知道数据注释在MVC中是如何工作的。我们不必单独称呼它

MVC是否在幕后调用这些数据注释属性

我希望创建一个自定义属性,我可以在任何类属性上使用它,就像数据注释属性一样。但是像上面的链接那样单独调用它并不是我想要的

以下是我尝试过的:

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是的,谢谢您的解释。