我正在开发一个库,其中入口点方法标有一些属性。内部方法需要知道入口点上的原始属性是否具有值1
,2
,3
...
[MyAttribute(1)]
public void Method1() {
InternalMethod();
}
[MyAttribute(2)]
public void Method2() {
InternalMethod();
}
[MyAttribute(3)]
public void Method3() {
InternalMethod();
}
我知道获取属性的唯一方法是遍历堆栈到根并搜索具有MyAttribute
属性的方法。这种方法的问题在于我使用StackTrace
类来实现它,这种方法太昂贵,因为在需要尽可能快的频繁HTTP
请求期间调用方法。
有什么方法吗?
答案 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)
假设:
InternalMethod
的任何特定直接调用网站在其堆栈跟踪中只有一个属性(您不会有来自不同位置的多个调用,然后在其他位置使用不同的属性值调用InternalMethod()
堆栈)如果这些假设属实,我会提出一个非常糟糕的建议......
将InternalMethod
签名更改为
void InternalMethod([CallerFilePath] string file = null, [CallerLineNumber] int line = 0)
此时,您的InternalMethod()
调用将获得编译器自动填充的路径和行号参数。这并不能帮助您获取该属性 - 但 意味着您可以对该调用站点执行一次的堆栈爬网,然后根据该属性填充缓存文件/行号组合。作为第一遍,您可以根据$"{file}:{line}"
进行缓存,但如果您想要更高的性能,则可以通过更复杂的缓存来避免字符串连接。
请注意,编译器会提供文件和行号,因此无论是发布版本还是内联方法等都无关紧要。