C#: чтение последнего пользовательского атрибута указанного типа c из стека вызовов - PullRequest
0 голосов
/ 20 апреля 2020

Я бы хотел украсить ряд функций пользовательским атрибутом. Эти функции не будут возвращать указанный тип c и могут действительно возвращать любой тип.

Теперь эта функция будет вызывать любое количество других функций, а затем в какой-то момент операции я хотел бы знать, «что» является последним пользовательским атрибутом текста / значения в стеке вызовов ".

Как мне это сделать?

Пример:

[CustomAttribute("Hello World...")]
public void SomeFunction
{
    return Func1("myparam")
}

public void Func1(string xx)
{
    return Func2(xx)
}

public string Func2(string yy)
{
    //I would like to know what is the value\text of the attribute "CustomAttribute".
    //If there are multiples in the call stack, return the last one (which might be in another class and project as Func2)
}

1 Ответ

2 голосов
/ 20 апреля 2020

Как упомянул @joe Sewell, общий подход заключается в том, чтобы перебрать stackTrace и проверить каждый метод, имеет ли он атрибут. Объединение Считывание значения атрибута метода с Получение трассировки стека дает следующий результат:

Вот пример того, как это сделать:

[System.AttributeUsage(System.AttributeTargets.Method)]
public class MyAttribute : Attribute
{
    public string Value { get; }

    public MyAttribute(string value)
    {
        Value = value;
    }

    public static string GetValueOfFirstInStackTrace()
    {
        StackTrace stackTrace = new StackTrace();           
        StackFrame[] stackFrames = stackTrace.GetFrames(); 

        foreach (var stackFrame in stackFrames)
        {
            var method = stackFrame.GetMethod();
            MyAttribute attr = (MyAttribute)method.GetCustomAttributes(typeof(MyAttribute), true).FirstOrDefault();
            if (attr != null)
            {
                string value = attr.Value;  
                return value;
            }
        }

        return null;
    }
}
...