Я пытался найти хороший способ внедрить вызов конструктора CustomAttribute с его указанными параметрами. CustomAttribute из Mono.Cecil предоставляет доступ к его конструктору, а также его параметрам. Значение параметра обычно дается как System.Object. Я не смог найти перегрузку ILProcessor.Create, которая принимает объект (что я нахожу совершенно нормальным).
Единственное решение, которое я мог придумать, это проверить тип параметра и, в зависимости от типа приведите его (или разбейте его, если это массив) к его буквальному типу (поскольку параметры конструктора атрибута ограничены типами значений и одномерными массивами), а затем используйте соответствующую инструкцию CIL для загрузки параметра. Я уже реализовал это таким образом, но это кажется утомительным и плохим способом решения этой проблемы. Еще раз, я новичок в CIL и Mono.Cecil, поэтому мои привычки как разработчика C# / более высокого уровня, а также отсутствие опыта могут быть причиной, по которой я вижу это таким образом.
Есть ли лучший способ добиться этого (кроме вызовов API отражений, которые я считаю не очень хорошим решением)? Большое спасибо!
РЕДАКТИРОВАТЬ: Пример того, что я имею в виду, предположим, есть такая настройка
public class CustomAttribute : Attribute {
public string s;
public int[] intArray;
public CustomAttribute(string s){
this.s = s;
}
}
[CustomAttribute("Hello World", intArray = new [] { 1, 2, 3 })]
public void DoSomething() {}
, затем я хочу ввести соответствующие инструкции для вызова этого во время выполнения:
new CustomAttribute("Hello World")
{
intArray = new [] { 1, 2, 3}
};
Я хотел бы отметить, что я достиг этого, перебирая параметры и решая, какую инструкцию вводить, основываясь на типе параметра (поскольку конструктор атрибута принимает очень конкретные c параметры), но я ' Я не уверен, что это лучший способ сделать это.