Я не знаю, как добраться до вызывающей без 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);
}
Когда вы говорите «Предпочтительно без stacktrace», что вы имеете в виду? Вы почти наверняка должны будете использовать 'StackTrace', чтобы узнать, что такое метод вызова, так почему вы хотите избежать этого? –
Почему бы не отметить второй метод с атрибутом? – Jodrell