在.NET/Silverlight应用程序开发过程中,经常需要展示关于应用程序的一些信息,例如“关于”对话框。这些信息通常包括标题、产品、版权、公司、描述、商标、配置、版本等。虽然对于经验丰富的开发者来说,手动获取这些信息并不困难,但重复这一过程确实繁琐。此外,初级开发者在使用反射技术获取这些属性时可能会遇到困难。本文将介绍一个优雅的助手类,利用泛型和Lambda表达式一次性解决这个问题。
要使用这个助手类,首先需要创建一个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(a => a.Title);
}
}
这个类的核心是GetValue
方法,它从程序集中获取一个泛型自定义属性。如果该属性存在,则返回getValue
委托的结果。如果属性不存在,则返回空字符串。
string GetValue(Func getValue) where T : Attribute
{
T a = (T)Attribute.GetCustomAttribute(_assembly, typeof(T));
return a == null ? "" : getValue(a);
}
public string Version
{
get
{
#if !SILVERLIGHT
return _assembly.GetName().Version.ToString();
#else
return _assembly.FullName.Split(',')[1].Split('=')[1];
#endif
}
}