一个空的程序集属性元素
本文关键字:程序集 属性 元素 一个 | 更新日期: 2023-09-27 18:16:03
我的应用程序有一些程序集。我决定为它写一个代理类。它在构造函数中加载程序集属性,并将其存储在只读字段中。
它的工作原理是这样的:
public class AssemblyInfo
{
private readonly Assembly ActiveAssembly;
private readonly AssemblyName ActiveAssemblyName;
public AssemblyInfo()
{
ActiveAssembly = System.Reflection.Assembly.GetEntryAssembly();
ActiveAssemblyName = ActiveAssembly.GetName();
FileVersionInfo = FileVersionInfo.GetVersionInfo(ActiveAssembly.Location);
if (ActiveAssembly != null)
{
Title = this.GetAttributeByType<AssemblyTitleAttribute>().Title;
}
}
public readonly string Title;
}
并且,在另一个程序集中:
sealed class CurrentAssemblyInfo : AssemblyInfo
{
}
它工作得很好,但我有一个问题与GetAttributeByType函数。目前是这样写的:
private T GetAttributeByType<T>() where T : Attribute
{
object[] customAttributes = ActiveAssembly.GetCustomAttributes(typeof(T), false);
if ((customAttributes != null) && (customAttributes.Length > 0))
return ((T)customAttributes[0]);
return null;
}
它工作得很好(并且节省了很多地方)。但是,如果没有找到,我返回null,如果没有找到这样的属性,这就不能正常工作。
是否有办法为这些属性类返回类似"空对象"的东西?我检查了MSDN。但是看起来所有这些Assembly*Attribute类甚至没有空的构造函数
你可以这样做:
private T GetAttributeByType<T>() where T : Attribute
{
object[] customAttributes = ActiveAssembly.GetCustomAttributes(typeof(T), false);
if ((customAttributes != null) && (customAttributes.Length > 0))
return ((T)customAttributes[0]);
return Activator.CreateInstance<T>();
}
我建议声明帮助方法:
private T GetAttributeByType < T >() where T : Attribute, new()
那么你可以返回new T()
如果属性没有默认的actor,那么就坚持你原来的方法,并使用:
private TResult GetAttributeProperty<TAttr,TResult>(TAttr attr, Func<TAttr, TResult> f) where TAttr : Attribute
{
return (attr != null) ? f(attr) : default(TResult);
}
并命名为
var s = GetAttributeProperty(GetAttributeByType<AssemblyTitleAttribute>(), a => a.Title);
但如果这比下面的更好,可以讨论…
var attrTitle = GetAttributeByType<AssemblyTitleAttribute>();
var s = attrTitle == null : null : attrTitle.Title;