2013-03-15 2 views
0
[TestAttribute(Name = "Test")] 
public void Test() 
{ 
    Test2(); 
} 

public viod Test2() 
{ 
    Console.Write(TestAttribute.Name); 
} 

Как показано выше, можно ли получить информацию об атрибуте Test при вызове Test2?Возможно получить атрибут метода во втором методе

Предпочтительно без штабеля.

+0

Когда вы говорите «Предпочтительно без stacktrace», что вы имеете в виду? Вы почти наверняка должны будете использовать 'StackTrace', чтобы узнать, что такое метод вызова, так почему вы хотите избежать этого? –

+0

Почему бы не отметить второй метод с атрибутом? – Jodrell

ответ

2

Вместо использования StackTrace вы могли бы использовать MethodBase.GetCurrentMethod() и передать его на дополнительный метод.

[TestAttribute(Name = "Test")] 
public void Test() 
{ 
    Test2(MethodBase.GetCurrentMethod()); 
} 

public viod Test2(MethodBase sender) 
{ 
    var attr = sender.GetCustomAttributes(typeof(TestAttribute), false).FirstOrDefault(); 
    if(attr != null) 
    { 
     TestAttribute ta = attr as TestAttribute; 
     Console.WriteLine(ta.Name); 
    } 
} 
+0

Мне нравится этот метод, но я думаю, что во всем было бы лучше просто передать атрибут с помощью метода? –

+0

@ TheunArbeider Это все хорошо и хорошо, но что, если вы измените атрибут вашего метода? Ваш код должен измениться. Я бы лично сохранил вышеуказанный код, он позволяет изменять. – LukeHennerley

+0

Я не знал о MethodBase, +1 от меня! –

0

Я не знаю, как добраться до вызывающей без StackTrace в вашем случае:

[TestAttribute(Name = "Test")] 
static void Test() { 
    Test2(); 
} 

static void Test2() { 
    StackTrace st = new StackTrace(1); 
    var attributes = st.GetFrame(0).GetMethod().GetCustomAttributes(typeof(TestAttribute), false); 
    TestAttribute testAttribute = attributes[0] as TestAttribute; 
    if (testAttribute != null) { 
     Console.Write(testAttribute.Name); 
    } 
} 

Альтернативой является явно передать информацию метод к функции:

[TestAttribute(Name = "Test")] 
void TestMethod() { 
    MethodInfo thisMethod = GetType().GetMethod("TestMethod", BindingFlags.Instance | BindingFlags.NonPublic); 
    Test3(thisMethod); 
} 

static void Test3(MethodInfo caller) { 
    var attributes = caller.GetCustomAttributes(typeof(TestAttribute), false); 
    TestAttribute testAttribute = attributes[0] as TestAttribute; 
    if (testAttribute != null) { 
     Console.Write(testAttribute.Name); 
    } 
} 

К Кстати, это не похоже на то, что вы хотите сделать с отражением; Я думаю, что в этом случае путь только это :)

void Test() { 
    Test2(name); 
} 

void Test2(string name) { 
    Console.Write(name); 
} 
+0

OP предпочтительно не имеет следов стека? – LukeHennerley

+3

Я не думаю, что это возможно. Предпочтительно означает, что это не строгое требование, не так ли? –

+0

Правильно, и я согласен, но, вероятно, было бы полезно объяснить, почему это невозможно :) – LukeHennerley

Смежные вопросы