一个空的程序集属性元素

本文关键字:程序集 属性 元素 一个 | 更新日期: 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()

而不是null编辑:

如果属性没有默认的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;