理解自定义特性(Attribute)
假设 外语老师 是一个类,
那么 外语老师 应该具有这样的特性:会说外语
并且 会说外语 这一特性又包含一些信息,比如:外语种类、外语水平、其它信息。
按照这样的理解,应该有下面的实现。
using System;
using System.Reflection;
namespace Test_Console
{
//自定义一个特性,名为 CanSpeakForeignLanguage ,继承自 System.Attribute
[AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = false)]
public class CanSpeakForeignLanguage : System.Attribute
{
private string _languageType;
private int _languageLevel;
private string _languageInfo;
//必须定义其构造函数,如果不定义有编译器提供无参默认构造函数
public CanSpeakForeignLanguage()
{
}
public CanSpeakForeignLanguage(string languageType, int languageLevel)
{
_languageType = languageType;
_languageLevel = languageLevel;
}
//定义属性
//特性和属性不是一回事
public string LanguageType
{
get { return _languageType == null ? string.Empty : _languageType; }
}
public int LanguageLevel
{
get { return _languageLevel; }
}
public string LanguageInfo
{
get { return _languageInfo; }
set { _languageInfo = value; }
}
//定义方法
public void CanSpeak()
{
Console.WriteLine("He can speak {0}.", _languageType == null ? "Chinese Only" : _languageType);
}
}
//定义一个类,LanguageTeacher ,这个类具有 CanSpeakForeignLanguage 特性
[CanSpeakForeignLanguage("English", 8, LanguageInfo = "This is US English, but not England English.")]
public class LanguageTeacher
{
public void SayHello()
{
Console.WriteLine("Hello, I'm a Foreign Language teacher, I can speak Foreign Language.");
}
}
//主程序
class Program
{
static void Main(string[] args)
{
Type type = typeof(LanguageTeacher);
MemberInfo memberinfo = type;
//利用反射获得 LanguageTeacher 所具有的特性信息,赋值给 can
CanSpeakForeignLanguage can = (CanSpeakForeignLanguage)Attribute.GetCustomAttribute(memberinfo, typeof(CanSpeakForeignLanguage));
//输出 LanguageTeacher 的特性信息
if (can != null)
{
Console.WriteLine("Class of LanguageTeacher Can Speak: " + can.LanguageType);
Console.WriteLine("The English Level of LanguageTeacher is: " + can.LanguageLevel);
Console.WriteLine("And, " + can.LanguageInfo);
}
Console.WriteLine();
//反射创建 LanguageTeacher 对象,执行它的 SayHello 方法
object obj = Activator.CreateInstance(type);
MethodInfo mi = type.GetMethod("SayHello");
mi.Invoke(obj, null);
}
}
}
得到的运行结果如下图:

浙公网安备 33010602011771号