Хорошо, вы можете принять аргумент типа или имени типа в конструкторе атрибутов. Например
[CoHandler(typeof(AccessHandler))]
или
[CoHandler("[Fully or partially qualified type name]")]
Прежнее использовать проще, а позже полезно, когда вы не хотите брать или не можете получить зависимость от сборки, содержащей тип.
Кстати, return default(T);
всегда будет возвращать ноль, я надеюсь, это просто для иллюстрации. Вот пример того, как вы можете использовать аргумент типа:
public class CoHandler : Attribute
{
private Type _Type;
public CoHandler(Type type)
{
_Type = type;
// Use reflection to validate type argument to see if it has
// inherited from ErrorHandler and check if its has parameterless
// constructor
}
public ErrorHandler GetHandler()
{
return (ErrorHandler)Activator.CreateInstance(_Type);
}
}