23. 阿宝陪你学C#【反射和特性】:面馆里的神秘侦探与神奇标签

阿宝陪你学C#【反射和特性】:面馆里的神秘侦探与神奇标签

嘿!面条侠们!我阿宝又来啦!之前咱们学会了用预处理指令这神秘小纸条调整程序 “配方”,今天咱们要挑战更酷的技能 —— 反射和特性!这就好比咱们面馆里来了神秘侦探,还出现了能赋予食材神奇能力的标签,有了它们,C# 编程会变得超有趣,快来跟我一起探索吧!

一、反射:面馆里的神秘侦探

想象一下,咱们面馆突然来了位神秘侦探,他不用进到后厨,就能知道厨房里有什么食材、正在做什么菜,还能知道每个厨师擅长的烹饪招式!在 C# 里,反射就像这位神秘侦探,它能在程序运行的时候,获取类型的信息,比如类里面有哪些方法、属性,甚至还能动态地创建对象、调用方法,是不是听起来超厉害!

1. 反射如何获取类型信息

咱们先看看反射怎么获取类型信息。就像侦探调查面馆里的菜单,反射可以 “调查” C# 里的类型。比如,我们有一个Noodle类:

class Noodle
{
   public string Name { get; set; }
   public int Price { get; set; }
   public void Cook()
   {
       Console.WriteLine($"正在烹饪{Name}面条!");
   }
}

用反射获取这个类的信息,就像侦探仔细查看菜单上的每道菜:

Type type = typeof(Noodle);

Console.WriteLine($"类名:{type.Name}");

// 获取属性
PropertyInfo[] properties = type.GetProperties();
foreach (PropertyInfo property in properties)
{
   Console.WriteLine($"属性名:{property.Name},类型:{property.PropertyType.Name}");
}


// 获取方法
MethodInfo[] methods = type.GetMethods();
foreach (MethodInfo method in methods)
{
   Console.WriteLine($"方法名:{method.Name}");
}

在这段代码里,typeof(Noodle)就像是侦探拿出放大镜,锁定了Noodle类。然后通过GetPropertiesGetMethods,就像侦探调查出了菜单上的菜品信息和厨师的烹饪招式,把类里的属性和方法都 “挖” 出来啦!

2. 反射创建对象和调用方法

更神奇的是,反射还能动态创建对象、调用方法!这就好比侦探不仅知道面馆能做什么菜,还能临时指挥厨师做菜!

object noodleInstance = Activator.CreateInstance(type);

PropertyInfo nameProperty = type.GetProperty("Name");
nameProperty.SetValue(noodleInstance, "牛肉面");

PropertyInfo priceProperty = type.GetProperty("Price");
priceProperty.SetValue(noodleInstance, 15);

MethodInfo cookMethod = type.GetMethod("Cook");
cookMethod.Invoke(noodleInstance, null);

这里,Activator.CreateInstance(type)就像侦探临时召集了一位厨师,创建出了Noodle类的对象。接着通过反射获取属性,设置面条的名字和价格,最后调用Cook方法,就像侦探指挥厨师开始烹饪牛肉面,超酷!

三、特性:面馆里的神奇标签

特性就像是咱们面馆里的神奇标签!给食材贴上不同的标签,就能赋予它们不同的神奇能力!在 C# 里,特性可以用来为代码添加额外的元数据信息,这些信息可以在编译时、运行时被读取和使用,能帮我们实现很多超实用的功能!

1. 内置特性

C# 有很多内置特性,比如[Obsolete]特性,就像给一道菜贴上 “即将下架” 的标签。当我们在代码里使用了标记为[Obsolete]的方法或类时,编译器就会发出警告,提醒我们这个东西不太好用啦,最好换别的!

[Obsolete("这个方法已经过时,请使用NewCookMethod", true)]
void OldCookMethod()
{
   Console.WriteLine("这是旧的烹饪方法");
}

void NewCookMethod()
{
   Console.WriteLine("这是新的烹饪方法");
}

当我们尝试调用OldCookMethod时,编译器就会报错,就像客人看到 “即将下架” 的菜,服务员会提醒他们别点一样。

还有[Serializable]特性,就像给食材贴上 “可打包” 的标签。如果一个类标记了这个特性,就表示它可以被序列化,也就是能把对象的数据保存起来,以后再恢复,就像把做好的面打包带走,下次还能吃!

2. 自定义特性

除了内置特性,我们还能自己定义特性!这就像我们在面馆发明新的神奇标签!比如,我们定义一个[SpecialNoodle]特性,用来标记那些特别的面条。

class SpecialNoodleAttribute : Attribute
{
   public string SpecialFeature { get; set; }
   public SpecialNoodleAttribute(string feature)
   {
       SpecialFeature = feature;
   }
}


[SpecialNoodle("超辣口味")]
class SpicyNoodle
{
   // 超辣面条类的代码
}

定义好特性后,我们还能用反射来读取这些特性信息,就像侦探查看这些神奇标签上写了啥!

Type spicyNoodleType = typeof(SpicyNoodle);

SpecialNoodleAttribute specialAttribute = (SpecialNoodleAttribute)Attribute.GetCustomAttribute(spicyNoodleType, typeof(SpecialNoodleAttribute));
if (specialAttribute != null)
{
   Console.WriteLine($"这碗面的特别之处是:{specialAttribute.SpecialFeature}");
}

这样,我们就能通过特性和反射,给代码添加更多有趣又实用的功能啦!

四、总结:掌握反射和特性的面条大侠

哇塞!今天咱们一起认识了 C# 里超酷的反射和特性!反射就像神秘侦探,能帮我们在程序运行时获取各种信息、动态操作;特性就像神奇标签,给代码添加额外的元数据。有了它们,我们在 C# 编程的江湖里就又多了两招超厉害的功夫!下次咱们继续探索 C# 世界里更多好玩的技能,不见不散哟!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿蒙Armon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值