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

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

上記のように、Test2で呼び出した際にTestの属性の情報を取得することは可能でしょうか?

スタックトレースなしが望ましい。

4

2 に答える 2

2

スタックトレースを使用する代わりに、それを使用MethodBase.GetCurrentMethod()して 2 番目のメソッドに渡すことができます。

[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 に答える