获取调用方法的属性

时间:2018-05-25 09:07:51

标签: c# .net

我正在开发一个库,其中入口点方法标有一些属性。内部方法需要知道入口点上的原始属性是否具有值123 ...

[MyAttribute(1)]
public void Method1() {
    InternalMethod();
}

[MyAttribute(2)]
public void Method2() {
    InternalMethod();
}

[MyAttribute(3)]
public void Method3() {
    InternalMethod();
}

我知道获取属性的唯一方法是遍历堆栈到根并搜索具有MyAttribute属性的方法。这种方法的问题在于我使用StackTrace类来实现它,这种方法太昂贵,因为在需要尽可能快的频繁HTTP请求期间调用方法。

有什么方法吗?

2 个答案:

答案 0 :(得分:4)

将数字传递给select students.PERSON_ID, students.ENROLL_PERIOD, AVG(Cast(grades.GRADE as numeric)) from Students INNER JOIN Grades on Students.PERSON_ID = Grades.PERSON_ID where ENROLL_PERIOD IS NOT NULL AND ENROLL_PERIOD <> '' GROUP BY students.PERSON_ID,students.ENROLL_PERIOD Order by students.ENROLL_PERIOD ASC 作为参数。

答案 1 :(得分:1)

假设:

  • 您当前的堆栈遍历路径正常工作
  • 根据TcKs的回答,您真的不想明确这样做
  • 您从相对较少的地方拨打电话
  • InternalMethod的任何特定直接调用网站在其堆栈跟踪中只有一个属性(您不会有来自不同位置的多个调用,然后在其他位置使用不同的属性值调用InternalMethod()堆栈)

如果这些假设属实,我会提出一个非常糟糕的建议......

InternalMethod签名更改为

void InternalMethod([CallerFilePath] string file = null, [CallerLineNumber] int line = 0)

此时,您的InternalMethod()调用将获得编译器自动填充的路径和行号参数。这并不能帮助您获取该属性 - 但 意味着您可以对该调用站点执行一次的堆栈爬网,然后根据该属性填充缓存文件/行号组合。作为第一遍,您可以根据$"{file}:{line}"进行缓存,但如果您想要更高的性能,则可以通过更复杂的缓存来避免字符串连接。

请注意,编译器会提供文件和行号,因此无论是发布版本还是内联方法等都无关紧要。