Могу ли я узнать, присутствовал ли определенный атрибут в вызывающей функции? - PullRequest
1 голос
/ 24 марта 2009

Есть ли способ узнать, были ли на вызывающей функции установлены атрибуты?

[RunOnPlatformB]
int blah()
{
    return boo();
}

int boo()
{
    // can i find out if RunOnPlatformB was set on my caller?
}

Ответы [ 2 ]

1 голос
/ 24 марта 2009

Вы можете получить функцию вызова из трассировки стека и запросить ее атрибуты:

System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace();
Object[] attr =
   st.GetFrame(1).GetMethod().GetCustomAttributes(typeof(RunOnPlatformBAttribute), false);
if (attr.Length > 0) {
   // Yes, it does have the attribute RunOnPlatformB
}
0 голосов
/ 24 марта 2009

Прежде всего, вам нужно подняться на StackFrame, чтобы найти то, что вас вызвало, по моему опыту, это ужасно дорогая операция, и может иметь также пробники безопасности в зависимости от контекста, в котором вы работаете. Код будет примерно таким -

using System.Diagnostics;
using System.Reflection;

....
    StackTrace stackTrace = new StackTrace();           
    StackFrame[] stackFrames = stackTrace.GetFrames(); 

    StackFrame caller = stackFrames[1]; 

    MethodInfo methodInfo = caller.GetMethod() as MethodInfo;
    foreach (Attribute attr in methodInfo.GetCustomAttributes())
    .....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...