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

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

如上图,在Test2中调用是否可以得到Test的属性信息呢?

最好没有堆栈跟踪。

4

2 回答 2

2

您可以使用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);
    }
}
于 2013-03-15T09:09:11.223 回答
1

在你的情况下,我不知道如何在没有堆栈跟踪的情况下找到调用者:

[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);
}
于 2013-03-15T09:01:23.230 回答