c#属性的相关学习总结。

Code
using System;
using System.Reflection;

using 定义;
using 颁发者;
using 使用者;
using 程序;

namespace 定义
{
    
public interface IJob
    
{
        
void Work();
    }

}


namespace 颁发者
{
    
//定义一个Slow的属性。它只能使用在方法上   

    [AttributeUsage(AttributeTargets.Method)]
    
public class SlowAttribute : Attribute
    
{
        
string desc;
        
public SlowAttribute(string waitdesc)
        
{
            desc 
= waitdesc;
        }

        
public string WaitDescription
        
{
            
get
            
{
                
return desc;
            }

        }

    }

}


namespace 使用者
{
    
public class 学习DotNet : IJob
    
{
        
public void Work()
        
{
            Console.WriteLine(
"-->学习完毕");
        }

    }

    
public class 精通DotNet : IJob
    
{
        [Slow(
"很久")]
        
public void Work()
        
{
            System.Threading.Thread.Sleep(
3000);
            Console.WriteLine(
"精通完毕");
        }

    }

}


namespace 程序
{
    
public interface IJobExecutor
    
{
        
void Execute(IJob job);
    }


    
class Util
    
{
        
static public MethodInfo FindJobWork(IJob job)
        
{
            InterfaceMapping map 
= job.GetType().GetInterfaceMap(typeof(IJob));
            
return map.TargetMethods[0];
        }

    }


    
public class 浮躁的人 : IJobExecutor
    
{
        
public void Execute(IJob job)
        
{
            MethodInfo mi 
= Util.FindJobWork(job);
            
bool isslow = mi.IsDefined(typeof(SlowAttribute), false);
            
if (!isslow)
            
{
                job.Work();
                Console.WriteLine(
"这么点小东西还难得到我?");
            }

            
else
            
{
                Console.WriteLine(
"靠,这么麻烦,老子不学了!!");
            }

        }

    }

    
public class 耐心的人 : IJobExecutor
    
{
        
public void Execute(IJob job)
        
{
            MethodInfo mi 
= Util.FindJobWork(job);
            
bool isslow = mi.IsDefined(typeof(SlowAttribute), false);
            
if (!isslow)
            
{
                job.Work();
                Console.WriteLine(
"努力,加油。");
            }

            
else
            
{
                SlowAttribute sa 
= (SlowAttribute)mi.GetCustomAttributes(typeof(SlowAttribute), false)[0];
                Console.WriteLine(
"虽然做这个需要" + sa.WaitDescription + ",但是我要把它完成。");
                job.Work();
                Console.WriteLine(
"哈哈。OK了");
            }

        }

    }

}


namespace ConsoleApplication1
{
    
class Class1
    
{
        [STAThread]
        
static void Main(string[] args)
        
{
            IJob j1 
= new 学习DotNet();
            IJob j2 
= new 精通DotNet();

            IJobExecutor exec1 
= new 浮躁的人();
            IJobExecutor exec2 
= new 耐心的人();

            Console.WriteLine();
            Console.WriteLine(
"广播:浮躁的人的:");
            Console.WriteLine();

            Console.WriteLine(
"广播:学习:");
            exec1.Execute(j1);
            Console.WriteLine(
"广播:精通:");
            exec1.Execute(j2);

            Console.WriteLine();
            Console.WriteLine(
"广播:耐心的人的学习:");
            Console.WriteLine();

            Console.WriteLine(
"广播:学习:");
            exec2.Execute(j1);
            Console.WriteLine(
"广播:精通:");
            exec2.Execute(j2);
        }

    }

}
  
//属性是自定义的元数据的标记和表现形式。   
//  属性的使用一般是被动的。   
//  两个部分组成:   
//  属性的颁发者和属性的使用者。   
    
//  属性的颁发者声明了某种意义。要求属性的使用者把符合该意义的构造型(类,成员,,)标记上它。   
//  那么属性的颁发者,就能通过根据它们是否有标记属性,和属性的数据进行某种操作了。   
    
//  其中属性的颁发者是主动地,而属性的使用者是被动的。   
    
//  对于平时,我们和我们创建的类只做为属性的使用者。   
    
//  例如对于可序列化的对象,我们只是定义:   
//  [Serilizable]   public   class   NameInfo   
//  {   
//          private   string   n="Undefined";   
//          public   string   Name   
//          {   
//                  get   
//                  {   
//                          return   n;   
//                  }   
//                  set   
//                  {   
//                          n=value;   
//                  }   
//          }   
//  }   
//  又例如在WebService里用到的WebServiceAttribute和WebMethodAttribute   
    
//  什么时候我们才做属性的颁布者,实现自己的属性?   
    
//  对于一般的应用,属性是用不上的。通常的扩展都使用虚拟继承来实现。   
//  只有当你做的东西有自己或其他人进行扩展时,才考虑使用自定义属性。   
    
//  我这里没法说得明白。下面放个容易理解为什么使用属性的例子吧:   
//  (这个例子需要些反射的知识)

转载于:https://www.cnblogs.com/cxfcxf8/archive/2008/05/01/1179068.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值