[TestAttribute(Name = "Test")]
public void Test()
{
Test2();
}
public viod Test2()
{
Console.Write(TestAttribute.Name);
}
上記のように、Test2で呼び出した際にTestの属性の情報を取得することは可能でしょうか?
スタックトレースなしが望ましい。
[TestAttribute(Name = "Test")]
public void Test()
{
Test2();
}
public viod Test2()
{
Console.Write(TestAttribute.Name);
}
上記のように、Test2で呼び出した際にTestの属性の情報を取得することは可能でしょうか?
スタックトレースなしが望ましい。
スタックトレースを使用する代わりに、それを使用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);
}
}
あなたの場合、スタックトレースなしで呼び出し元に到達する方法がわかりません:
[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);
}