感谢Giorgio Minardi指导我研究StoryQ.Formatting命名空间。在那里我发现我可以使用一个简单的属性来覆盖方法格式。
API 提供了一个OverrideMethodFormatAttribute
(从抽象类子类化MethodFormatAttribute
),如果您想使用特定的字符串常量,它可以工作,但 C# 不喜欢该方法在属性中的类型参数。T
由于in 属性,这不会编译:
[OverrideMethodFormat(string.Format("exception is thrown ({0})", typeof(T).Name))]
private void ExceptionIsThrown<T>() where T : Exception
{
...
}
解决方案是创建另一个MethodFormatAttribute
子类,专门搜索泛型类型的方法并输出它们。该子类如下:
public class GenericMethodFormatAttribute : MethodFormatAttribute
{
private readonly string _textFormat;
public GenericMethodFormatAttribute()
{
_textFormat = null;
}
public GenericMethodFormatAttribute(string textFormat)
{
_textFormat = textFormat;
}
public override string Format(MethodInfo method,
IEnumerable<string> parameters)
{
var generics = method.GetGenericArguments();
if (_textFormat == null)
{
var genericsList = string.Join<Type>(", ", generics);
return string.Format("{0} ({1})",
UnCamel(method.Name),
genericsList);
}
return string.Format(_textFormat, generics);
}
}
用法几乎与提供的属性类似,只是您可以选择提供格式字符串而不是字符串常量。省略格式字符串 un-camel-cases 方法名称就像默认行为一样。
[GenericMethodFormatAttribute]
private void ExceptionIsThrown<T>() where T : Exception
{
...
}
这使我可以在源代码中声明属性,而不必接触 StoryQ 代码。10 分给 StoryQ 的可扩展性!