空的Assembly Attribute元素

时间:2011-11-26 18:18:01

标签: c#

我的应用程序有一些程序集。我决定为它编写一个代理类。它在构造函数中加载程序集属性,并将它们存储在只读字段中。

它的工作原理如下:

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类都没有空构造函数。

2 个答案:

答案 0 :(得分:0)

你可以这样做:

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>(); 
} 

答案 1 :(得分:0)

我建议申报帮助方法:

private T GetAttributeByType < T >() where T : Attribute, new() 

然后您可以返回new T()

而不是null

编辑:

如果属性没有默认的ctor坚持原始方法并使用:

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;