Скажем, у меня есть образец, который я постоянно повторяю. Что-то вроде:
static class C {
[DllImport("mydll")]
private static extern uint MyNativeCall1(Action a);
public static uint MyWrapper1(Action a) {
// Do something
return MyNativeCall1(a);
}
[DllImport("mydll")]
private static extern uint MyNativeCall2(Action a);
public static uint MyWrapper2(Action a) {
// Do something
return MyNativeCall2(a);
}
//...
[DllImport("mydll")]
private static extern uint MyNativeCallN(Action a);
public static uint MyWrapperN(Action a) {
// Do something
return MyNativeCallN(a);
}
}
Единственное отличие во всех этих случаях - это имя встроенной функции и метода обёртки. Есть ли способ генерировать их через что-то вроде декораторов? Сначала я думал, что атрибуты С# были декораторами. То есть, я мог бы сгенерировать код через что-то вроде [GenerateScaffolding("MyNativeCall1")]
. Но, похоже, атрибуты скорее напоминают аннотации, создавая экземпляр класса, содержащего некоторые метаданные.
Также нет макросов С#. Так есть ли способ сделать это?
Несколько вещей, которые нужно иметь в виду:
- Идея заключается в том, что методы-обертки имеют дополнительный код; они не просто называют нативные функции.
- Идея также заключается в том, что сгенерированный код может чередоваться с другим существующим кодом внутри класса, а не для создания самого файла класса; что-то вроде декораторов или макросов C/С++.
- Подход не должен зависеть от какой-либо конкретной среды разработки. В частности, я не на Visual Studio.