C# 获取调用方法的属性
我正在处理一个库,其中入口点方法用一些属性标记。内部方法需要知道入口点上的原始属性的值是否为C# 获取调用方法的属性,c#,.net,C#,.net,我正在处理一个库,其中入口点方法用一些属性标记。内部方法需要知道入口点上的原始属性的值是否为1,2,3 [MyAttribute(1)] public void Method1() { InternalMethod(); } [MyAttribute(2)] public void Method2() { InternalMethod(); } [MyAttribute(3)] public void Method3() { InternalMethod(); }
1
,2
,3
[MyAttribute(1)]
public void Method1() {
InternalMethod();
}
[MyAttribute(2)]
public void Method2() {
InternalMethod();
}
[MyAttribute(3)]
public void Method3() {
InternalMethod();
}
我知道获取属性的唯一方法是遍历堆栈到根,并搜索具有MyAttribute
属性的方法。这种方法的问题是我使用StackTrace
类来实现它,这太昂贵了,因为在频繁的HTTP
请求期间调用这些方法需要尽可能快
有什么办法吗?将数字作为参数传递给
内部方法。将数字作为参数传递给内部方法。假设:
- 您当前的堆栈遍历路由有效
- 你真的不想按照TcKs的回答明确地做这件事
- 你从相对较少的地方打电话
- 对
InternalMethod
的任何特定直接调用站点在其堆栈跟踪中都只有一个属性(您不会有多个来自不同位置的调用,然后使用堆栈中其他位置的不同属性值调用InternalMethod()
)
如果这些假设是真的,我有一个非常粗糙的建议
将内部方法
签名更改为
void InternalMethod([CallerFilePath] string file = null, [CallerLineNumber] int line = 0)
此时,InternalMethod()
调用将获得编译器自动填充的路径和行号参数。这无助于获取属性,但它确实意味着您可以对该调用站点执行一次堆栈爬网,然后根据该文件/行号组合填充缓存。作为第一步,您可以只基于$“{file}:{line}”
进行缓存,但是如果您想要更高的性能,您应该避免通过更复杂的缓存进行字符串连接
请注意,编译器提供了文件和行号,因此不管它是发布版本还是方法是内联的,等等。假定:
- 您当前的堆栈遍历路由有效
- 你真的不想按照TcKs的回答明确地做这件事
- 你从相对较少的地方打电话
- 对
InternalMethod
的任何特定直接调用站点在其堆栈跟踪中都只有一个属性(您不会有多个来自不同位置的调用,然后使用堆栈中其他位置的不同属性值调用InternalMethod()
)
如果这些假设是真的,我有一个非常粗糙的建议
将内部方法
签名更改为
void InternalMethod([CallerFilePath] string file = null, [CallerLineNumber] int line = 0)
此时,InternalMethod()
调用将获得编译器自动填充的路径和行号参数。这无助于获取属性,但它确实意味着您可以对该调用站点执行一次堆栈爬网,然后根据该文件/行号组合填充缓存。作为第一步,您可以只基于$“{file}:{line}”
进行缓存,但是如果您想要更高的性能,您应该避免通过更复杂的缓存进行字符串连接
请注意,编译器提供了文件和行号,因此不管它是发布版本,还是方法是内联的,等等。这是一个奇怪的要求,但是的,StackFrame
是显而易见的解决方案。这是一个奇怪的要求,但是的,StackFrame
是显而易见的解决方案。简洁,yehaaNeat和simple,yehaa