Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取调用方法的属性_C#_.net - Fatal编程技术网

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