65.9K
CodeProject 正在变化。 阅读更多。
Home

检索程序集属性

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2009年12月18日

CPOL

1分钟阅读

viewsIcon

22482

downloadIcon

392

一个辅助类,用于轻松检索程序集属性。

引言

AssemblyAttributes 是一个可爱的辅助类,对于几乎每个显示自身信息的 .NET/Silverlight 应用程序(例如“关于”对话框)都非常有用。它以一种简单且一致的方式检索以下程序集属性

  • 标题
  • 产品
  • Copyright
  • Company
  • 描述
  • 商标
  • 配置
  • 版本
  • 文件版本
  • 信息版本

对于经验丰富的开发人员来说,这样做轻而易举,但手动获取这些信息 100 次会非常繁琐。而且,初级开发人员有时难以使用反射来获取这些属性。借助泛型和 Lambda 表达式,您可以编写一个优雅的类来一次性解决此问题。

Using the Code

创建 AssemblyAttributes 类的一个实例并查询其属性

AssemblyAttributes assembly = new AssemblyAttributes();

Console.WriteLine("Title: " + assembly.Title);
Console.WriteLine("Product: " + assembly.Product);
Console.WriteLine("Version: " + assembly.Version);

您可以像这样向构造函数传递一个显式程序集

var assembly = new AssemblyAttributes(Assembly.GetEntryAssembly());

关注点

由于泛型和 lambda,每个属性的实现都非常优雅

public string Title 
{
    get { return GetValue<AssemblyTitleAttribute>(a => a.Title); } 

}

这个类的真正核心是 GetValue 方法。它从程序集中获取泛型自定义属性。如果存在,它将返回该属性上的 getValue 委托的结果。如果属性不存在,则返回空字符串。

string GetValue<T>(Func<T, string> getValue) where T : Attribute
{
    T a = (T)Attribute.GetCustomAttribute(_assembly, typeof(T));
    return a == null ? "" : getValue(a);
}

请注意 Version 属性实现中的解决方法,这对于 Silverlight 3 是必需的,因为 GetName() 方法被标记为 security_critical,不能由用户代码调用。

public string Version
{
    get
    {
#if !SILVERLIGHT
        return _assembly.GetName().Version.ToString(); 
#else
        return _assembly.FullName.Split(',')[1].Split('=')[1]; 
#endif
     }
}
© . All rights reserved.