Есть ли способ использования перехвата атрибутом в C# единицу и сохранить код регистрации объекта в файле XML (например, app.config)? Если да, можете ли вы предоставить мне код, как должна выглядеть такая регистрация? Я сделал много обходных решений, но не нашел рабочего решения для этой проблемы.Перехват единственного элемента C# по атрибуту
ответ
Я предполагаю, что вы имеете в виду использование настраиваемого атрибута, чтобы указать, какие методы перехватывать. Вы можете использовать инъекцию политики для достижения перехвата с использованием конфигурации XML.
Во-первых, давайте определим пользовательский атрибут:
[AttributeUsage(AttributeTargets.Method)]
public class MyInterceptionAttribute : Attribute
{
}
Далее мы можем создать ICallHandler, чтобы сделать некоторые отсечной работы. Эта реализация будет просто сделать Console.WriteLine до и после метода:
public class MyLoggingCallHandler : ICallHandler
{
IMethodReturn ICallHandler.Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{
Console.WriteLine("Invoking " + input.MethodBase.Name);
IMethodReturn result = getNext()(input, getNext);
Console.WriteLine("Done Invoke");
return result;
}
int ICallHandler.Order { get; set; }
}
Далее давайте предположим, что мы имеем некоторый интерфейс и реализация:
public interface IMyClass
{
void Do();
void DoAgain();
}
public class MyClass : IMyClass
{
[MyInterception]
public void Do()
{
Console.WriteLine("Do!");
}
public void DoAgain()
{
Console.WriteLine("Do Again!");
}
}
Обратите внимание, что я применил пользовательский атрибут , MyInterception, только для метода Do, но не для метода DoAgain. Мы перехватим все вызовы метода Do.
Далее мы создаем конфигурацию, чтобы определить политику, настроить правило соответствия и зарегистрировать тип вместе с перехватчиком:
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<namespace name="UnityCallHandlerConfig" />
<assembly name="UnityCallHandlerConfig" />
<sectionExtension type="Microsoft.Practices.Unity.InterceptionExtension.Configuration.InterceptionConfigurationExtension, Microsoft.Practices.Unity.Interception.Configuration"/>
<container>
<extension type="Interception"/>
<interception>
<policy name="Policy">
<matchingRule name="Match" type="Microsoft.Practices.Unity.InterceptionExtension.CustomAttributeMatchingRule, Microsoft.Practices.Unity.Interception">
<constructor>
<param name="attributeType" value="UnityCallHandlerConfig.MyInterceptionAttribute, UnityCallHandlerConfig" typeConverter="AssemblyQualifiedTypeNameConverter" />
<param name="inherited">
<value value="false"/>
</param>
</constructor>
</matchingRule>
<callHandler name="MyLogging" type="MyLoggingCallHandler">
<lifetime type="singleton"/>
</callHandler>
</policy>
</interception>
<register type="IMyClass" mapTo="MyClass">
<interceptor type="InterfaceInterceptor"/>
<interceptionBehavior type="PolicyInjectionBehavior"/>
</register>
</container>
</unity>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
</startup>
</configuration>
Мы также нужен конвертер типа для преобразования строкового представления пользовательского атрибута соответствующий тип:
public class AssemblyQualifiedTypeNameConverter : ConfigurationConverterBase
{
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
{
if (value != null)
{
Type typeValue = value as Type;
if (typeValue == null)
{
throw new ArgumentException("Cannot convert type", typeof(Type).Name);
}
if (typeValue != null) return (typeValue).AssemblyQualifiedName;
}
return null;
}
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
string stringValue = (string)value;
if (!string.IsNullOrEmpty(stringValue))
{
Type result = Type.GetType(stringValue, false);
if (result == null)
{
throw new ArgumentException("Invalid type", "value");
}
return result;
}
return null;
}
}
После того, как у нас есть все, что создали мы можем создать контейнер и загрузить конфигурацию:
var container = new UnityContainer().LoadConfiguration();
var myClass = container.Resolve<IMyClass>();
myClass.Do();
myClass.DoAgain();
Выходной сигнал будет:
Invoking Do
Do!
Done Invoke
Do Again!
, показывающий, что первый метод перехватывается в то время как второй нет.
- 1. Ninject: Перехват по атрибуту без выделения из InterceptAttribute
- 2. PHP: получение значения элемента XML по атрибуту
- 3. Как запросить Firebase по атрибуту дочернего элемента?
- 4. Сортировка баз divs по атрибуту данных элемента
- 5. Поиск элемента xml по атрибуту в php
- 6. Перехват удаления элемента из ngRepeat
- 7. C# Выберите узел из XML по атрибуту
- 8. Сортировка XmlDocument по атрибуту с использованием C#
- 9. C# Dictionary ContainsValue поиск по атрибуту объекта
- 10. Полная ширина единственного элемента в контейнере flex
- 11. Фильтрация по атрибуту данных
- 12. Быстрая фильтрация списка по атрибуту каждого элемента (типа scikit-image.RegionProperties)
- 13. Позиция единственного гироскопа по умолчанию
- 14. Перехват вызовов по свойствам
- 15. Entity Framework действительно медленный Получение единственного элемента
- 16. Получение ключа единственного элемента в массиве PHP
- 17. Транспортира: Найти элемент по атрибуту
- 18. Извлечь значение элемента по атрибуту с помощью linq в xml
- 19. найти элемент по атрибуту, установить другой атрибут найденного элемента
- 20. Использовать JDOM для удаления элемента по его атрибуту?
- 21. Выбор элемента по атрибуту name из определенного разделителя в jquery
- 22. Выбор соседа элемента, выбранного по классу и атрибуту
- 23. Watcher по атрибуту элемента для изменения элементов внутреннего html
- 24. jQuery Выбор элемента по атрибуту данных Неожиданные результаты
- 25. Реализация единственного значения Разложение C++
- 26. Найти объект по атрибуту
- 27. Сортировка элементов по атрибуту
- 28. NullPointerException по статическому атрибуту
- 29. Найти элемент по атрибуту
- 30. ActiveRecord: уникально по атрибуту
Большое спасибо за помощь! –
@Tuzo, как выглядела конфигурация в коде C#? Вам все еще нужно «AssemblyQualifiedTypeNameConverter», если это сделано в коде? –