我的应用程序有一些程序集。我决定为它编写一个代理类。它在构造函数中加载程序集属性,并将它们存储在只读字段中。
它的工作原理如下:
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类都没有空构造函数。
答案 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()
编辑:
如果属性没有默认的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;