Внедрение вызова в конструктор CustomAttribute со значениями параметров [Mono.Cecil] - PullRequest
0 голосов
/ 21 января 2020

Я пытался найти хороший способ внедрить вызов конструктора 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 параметры), но я ' Я не уверен, что это лучший способ сделать это.

...