Это продолжение ответа бентайлорука.Я попробовал его Вариант 2 , но он не сработал.Вскоре я заметил, что это потому, что я использую перехватчики AutoFac.AutoFac передает тип прокси-класса в конструктор поиска, но эти конструкторы не имеют атрибутов, определенных для конструкторов в базовом классе.
Для этой работы мой код сравнивает сигнатуры конструктора обоих классов, чтобы найти«правильный» конструктор и проверяет наличие атрибута.
public class NonObsoleteConstructorFinder : IConstructorFinder
{
private readonly DefaultConstructorFinder _defaultConstructorFinder = new DefaultConstructorFinder();
public ConstructorInfo[] FindConstructors(Type targetType)
{
// Find all constructors using the default finder
IEnumerable<ConstructorInfo> constructors = _defaultConstructorFinder.FindConstructors(targetType);
// If this is a proxy, use the base type
if (targetType.Implements<IProxyTargetAccessor>())
{
// It's a proxy. Check for attributes in base class.
Type underlyingType = targetType.BaseType;
List<ConstructorInfo> constructorList = new List<ConstructorInfo>();
// Find matching base class constructors
foreach (ConstructorInfo proxyConstructor in constructors)
{
Type[] parameterTypes = proxyConstructor.GetParameters()
.Select(pi => pi.ParameterType)
.Skip(1) // Ignore first parameter
.ToArray();
ConstructorInfo underlyingConstructor = underlyingType.GetConstructor(parameterTypes);
if (underlyingConstructor != null &&
!underlyingConstructor.HasAttribute<ObsoleteAttribute>())
{
constructorList.Add(proxyConstructor);
}
}
constructors = constructorList;
}
else
{
// It's not a proxy. Check for the attribute directly.
constructors = constructors.Where(c => !c.HasAttribute<ObsoleteAttribute>());
}
return constructors.ToArray();
}
}
Примечание 1: Skip(1)
требуется, поскольку первый аргумент конструктора прокси имеет тип IInterceptor[]
.Это используется AutoFac для передачи перехватчиков.
Примечание 2: targetType.Implements<IProxyTargetAccessor>()
и underlyingConstructor.HasAttribute<ObsoleteAttribute>()
- это методы расширения, предоставляемые библиотекой Fasterflect.