想问个问题:关于自定义特性的问题
①加入我自定义一个特性,定义好之后我把它添加到方法头上,如果运行代码,系统是怎么知道我方法头上添加了特性的呢?
②如果系统会自动检查特性,那么它是怎么知道我添加的是什么特性,又是怎么知道我添加的特性会对代码产生什么影响呢?
上面的问题一直困扰着我!各位大哥可以帮我讲解下!
特性 就是一个 标记 . 或者 锚点
用来 在反射时 查找 识别 被 标记的 (方法 类型 字段.....)
如果 你使用的 特性 是系统 默认的,那他调用的 时候 可以识别,
如果是你自己定义的 那就只能 你自己 识别,
[Command("BuildInCommands", "Shell Build-in Commands")]
public class BuildInCommands : CommandParser
{
private static readonly Dictionary<string, Dictionary<string, Action>> CommandExtend =
new Dictionary<string, Dictionary<string, Action>>();
#region Build-in method
[Command("?", "display command help")]
public static void DisplayHelp(string commandName, bool showExtend = true)
{
[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method, Inherited = false)]
public class CommandAttribute : Attribute
{
public CommandAttribute()
{
}
public CommandAttribute(string name, string description = "", bool viewAble = true)
{
Name = name;
Description = description;
ViewAble = viewAble;
}
foreach (var method in
type.GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static))
{
var attr = method.GetCustomAttributes(typeof(CommandAttribute), false);
{
if (attr.Length > 0)
{
var cmd = ((CommandAttribute)attr[0]).Name ?? method.Name;
if (CommandDic.ContainsKey(cmd))
{
ColorConsole.Display(
string.Format("This Command has allready added ->{0}", cmd));
}
else
{
count++;
CommandDic.Add(cmd, method);
}
}
}
}
怎么感觉代码有点乱,那个通过反射获取特性的方法应该放在哪里?
比如:自定义一个特性类,然后通过反射获取特性的代码应该放在哪里(是要专门写一个类吗?)!
@程序猿就是我:
var attr = method.GetCustomAttributes(typeof(CommandAttribute), false);
@程序猿就是我:
第一段代码 特性标记,
第二段代码,特性的定义。
第三段代码。使用特性。
@waninlezu:
好,差不多明白了,剩下最后一个问题!
定义好特性之后,我也写了一个获取特性的方法,这个方法是不是要单独放在一个类中,还是跟放在特性类中?
如果把这个特性添加到一个方法或类的头上,当程序运行时,系统会不会自动的去执行那个获取特性的方法?
也就是说怎么把获取特性的方法跟自定义的特性关联起来?
@程序猿就是我: 请在给我讲解下!谢谢!
你说的特性是Attribute吧?
1:你新定义了一个特性,假设是ShopAttribute,就由它处理具体的逻辑,它知道了,你所谓的“系统”不也就知道了,不信你在ShopAttribute内部加个断言看看?
2:系统在编译时会取一些常用的Attribute,(你也以建立一个工程,查看AssemblyInfo.cs)文件,但它只负责读取系统版本、开发信息、开发公司名称等,你定义的Attribute还是要归你来维护 。
感觉你对Attribute不是太了解,有了为了学而学的意思。Attribute本质是描述一个类/对象/方法/等一切.Net对象的元数据,至于这些元数据定义好了以后,怎么用?如何用?还是要由你自己来决定。
NUnit有大量的Attribute使用,这两天我会把它们的详细使用写下来,你如果对Attribute感兴趣的话,可以关注一下。
建议先看看这篇,熟悉一下NUnit,然后再等第二/三个文章的链接,这里面会对Attribue 的具体使用进行详细介绍
http://www.cnblogs.com/gannan/archive/2012/02/09/2343416.html
能不能给个示例,我还是不怎么清楚!
1:系统不知道你自定义的特性,必须在运行时自己写分析程序去找;
2:同上
如果你用一些自带的特性比如:[serializable],它也就是在当前的类信息中添加了一条我能被序列化,在运行时中只有也只在此类被序列化时会被序列化器读取。
如果你说为什么自定义了一个特性后vs就知道了,那是因为vs会编译并分析出所有继承自Attribute的特性并在智能提示中提示你。
其实特性说白了也就是一段说明也就是说在特性类里你无法添加处理逻辑,只用来在运行时反射获取,它的特点是使用方便也是解耦的一种途径。
有点头绪了,你是说如果我自定义了一个特性,这个特性是没有什么逻辑的,然后我需要专门写个类反射这个特性,然后在再里面写逻辑是吧!
@程序猿就是我: 是的