通过声明Attribute属性改变不同类的输出效果

ConsoleApplication--控制台应用程序

首先创建基类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Attribute_Exercise
{
    /// <summary>
    /// 此处的注释不影响编译和运行,只是给开发者提供帮助
    /// </summary>
    //[some Attribute]  e.g.
    [Obsolete] //[Obsolete]、[Obsolete("")]、[Obsolete("",true/false)]  Obsolete的构造函数 F12查看
    [Serializable]
    public class BasicClass
    {
        //基类属性、字段
        public int ID { set; get; }

        public string Name { set; get; }

    }

    public class AClass:BasicClass
    {

    }

    public class BClass : BasicClass
    { 

    }

    public class CClass : BasicClass
    { 

    }
}

其次自定义一个Attribute:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Attribute_Exercise
{
    /// <summary>
    /// 自定义一个Attribute:somename+Attribute
    /// 使用时:[somename]
    /// </summary>
    public class CustomizedAttribute:Attribute
    {
        //以下是构造函数
        public CustomizedAttribute()
        {
           //空
        }

        public CustomizedAttribute(string msg)
        { 

        }

        public CustomizedAttribute(string msg, bool err)
        { 

        }

        //字段
        public string Msg;
        public bool Err;

    }

    public class esleCusomizedAttribute : Attribute
    { 

    }
}

在主入口中:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Attribute_Exercise
{
    class Program
    {
        static void Main(string[] args)
        {
            //主要运用了继承的机制
            BasicClass bc = new BasicClass() { ID=1,Name="基类1"};
            Console.WriteLine("基类ID:{0}  ;基类类名:{1}",bc.ID,bc.Name);
            Console.ReadLine();
        }
    }
}

先看看基类的效果:

下面进入主题--如何在不改变基类及其继承类的对象的情况下,仅仅通过声明Attribute,使得这些继承类具有不同的行为或者效果?

1.声明Attribute:在BasicClass.cs Line 23处增加 [Customized] ;

2.增加相应Attribute的方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;//反射
using System.Text;
using System.Threading.Tasks;

namespace Attribute_Exercise
{
    public class AttributeActivities
    {
        public static void OutPut<T>(T t) where T : BasicClass
        {
            Type type=t.GetType();
            Attribute attribute = type.GetCustomAttribute(typeof(CustomizedAttribute));//注意  using System.Reflection;
            if (attribute != null && attribute is CustomizedAttribute)
            {
                CustomizedAttribute customizedAttr = attribute as CustomizedAttribute;

                Console.WriteLine("当前类额外的Attribute:{0}",
                    customizedAttr.ToString().Substring(customizedAttr.ToString().IndexOf(".")+1));
                Console.WriteLine("+++++++++++++++++++++++++++++++++++++++++++++++++");
            }

        }
    }
}

3.在程序主入口调用方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Attribute_Exercise
{
    class Program
    {
        static void Main(string[] args)
        {
            //主要运用了继承的机制
            BasicClass bc = new BasicClass() { ID=1,Name="基类1"};
            Console.WriteLine("基类ID:{0}  ;基类类名:{1}",bc.ID,bc.Name);
            Console.WriteLine("*************************************************");
            AttributeActivities.OutPut<AClass>(new AClass()
            {
                ID=2,
                Name="AClass"
            });
            Console.WriteLine("*************************************************");
            AttributeActivities.OutPut<BClass>(new BClass()
            {
                ID = 3,
                Name = "BClass"
            });
            Console.WriteLine("*************************************************");
            AttributeActivities.OutPut<CClass>(new CClass()
            {
                ID = 4,
                Name = "CClass"
            });

            Console.ReadLine();
        }
    }
}

结果截图:

是不是感觉很神奇呢? 并没有对这个继承类做任何修改,这是多了个声明,然后附加相应的方法就实现了拥有不同Attribute的类具有不同的效果。

读者也可以自己扩展其它的方法试试哦。。。

注:未经作者同意,禁止转载!转载请说明出处!请尊重知识产权。

时间: 2024-11-04 00:40:26

通过声明Attribute属性改变不同类的输出效果的相关文章

WPF——数据绑定及属性改变事件

一.首先需要封装一下文本框的属性,并且在实体类中添加一个实体类的属性改变函数 public class User : INotifyPropertyChanged //INotifyPropertyChanged接口是 WPF/Silverlight 开发中非常重要的接口, 它构成了 ViewModel 的基础, 数据绑定基本上都需要这个接口. { private string _Wenben; public string Wenben { get { return _Wenben; } set

python类内init外声明的属性与init内声明的对象属性的访问和操作区别

python类内init外声明的属性与init内声明的对象属性的访问和操作区别(面试题) 1.在ipython中输入以下代码,其输出会是什么? In [1]: class ClassOut: ...: out_mem = 'out_mem' ...: print out_mem ...: def __init__(self): ...: inner_mem = 'inner_mem' ...: self.inner_mem = 'self.inner_mem' ...: self._inner_

【ASP.NET】DataContract序列化,反序列化对象中包含用接口声明的属性时的处理方法

为此对象添加KnownType属性(Attribute).类型为用接口声明的属性(Property)的所有可能类型. 示例如下: 1 public interface IKey 2 { 3 [DataMember] 4 int Id { get; set; } 5 6 [DataMember] 7 string Name { get; set; } 8 } 9 10 [DataContract] 11 public abstract class KeyBase : IKey 12 { 13 [D

Java重要技术(15)内省之属性改变事件和投票否决事件

1.1. 属性改变事件和投票否决事件 PropertyChangeSupport类为Java Bean支持属性改变事件提供了方便. /** * @Title: EventBean.java * @Package com.test.javatechnology.introspection * @Description: * @author http://www.cnblogs.com/coe2coe/ * @date 2017年3月25日 下午6:02:36 * @version V1.0 */

silverlight属性改变事件通知

工作中遇到silverlight本身没有提供的某些属性改变事件,但又需要在属性改变时得到通知,Google搬运stack overflow,原地址 /// Listen for change of the dependency property public void RegisterForNotification(string propertyName, FrameworkElement element, PropertyChangedCallback callback) { //Bind t

绑定元素属性改变不通知界面

情景假设:绑定的是一个Point,当Point的X或者Y属性发生改变时,绑定的点也随界面改变 此时界面不会发生改变 原因:当X或者Y属性发生改变时并没有触发Point的Set方法 1 <Grid> 2 <Grid.Resources> 3 <local:PConverter x:Key="converter"/> 4 <local:PointsConverter x:Key="pointsC"/> 5 6 <St

C#里Attribute属性

系统内置属性 系统内置的Attribute属性Obsolete,被个这属性标记的方法在别的地方被调用的时候会有警告提示; 这个属性还可以指定第二个布尔参数,设置编译时是否报错; 例: 1 [Obsolete("not used")] 2 private void AttributeTest() 3 { 4 MessageBox.Show("not used"); 5 }

一个类在另一个类中以集合形式声明为属性时应该注意的问题

标题:一个类在另一个类中以集合形式声明为属性时应该注意的问题,先解释一下,看下面的代码吧 [Serializable] public class MO_T_sj_quest { public List<MO_T_sj_answer> AnswerList { get; set; } public List<MO_T_sj_answer> IDList { get; set; } public List<MO_T_sj_quest_bind> BindList { get

GTK进阶学习:属性改变事件

当窗口初始化,被移动或拉伸时,会触发属性改变事件. 属性改变事件产生的信号:configure_event 其回调函数的定义如下: gboolean callback( GtkWidget *widget, GdkEventConfigure *event, gpointer data ) { event:属性事件结构体变量,系统内部的变量,不是用户传参的 event->x,event->y:窗口的起点坐标 event->width,event->height:窗口的大小 } 以下