gpt4 book ai didi

c# - 如何将管道代码注入(inject)/生成用属性装饰的方法?

转载 作者:可可西里 更新时间:2023-11-01 09:07:49 24 4
gpt4 key购买 nike

我正在阅读一些关于缓存和记忆化以及如何使用委托(delegate)和泛型轻松实现它的文章。语法非常简单,而且实现起来非常容易,但我只是觉得由于重复性,应该可以根据属性生成代码,而不必一遍又一遍地编写相同的管道代码。

假设我们从默认示例开始:

class Foo
{
public int Fibonacci(int n)
{
return n > 1 ? Fibonacci(n-1) + Fibonacci(n-2) : n;
}
}

然后记住这个:

// Let's say we have a utility class somewhere with the following extension method:
// public static Func<TResult> Memoize<TResult>(this Func<TResult> f)

class Foo
{
public Func<int,int> Fibonacci = fib;

public Foo()
{
Fibonacci = Fibonacci.Memoize();
}

public int fib(int n)
{
return n > 1 ? Fibonacci(n-1) + Fibonacci(n-2) : n;
}
}

我想,一旦找到与 Memoize 扩展方法之一匹配的标记方法,只制作一个吐出这段代码的代码生成器会不会更简单。因此,无需编写此管道代码,我可以只添加一个属性:

class Foo
{
[Memoize]
public int Fibonacci(int n)
{
return n > 1 ? Fibonacci(n-1) + Fibonacci(n-2) : n;
}
}

老实说,我知道这看起来更像是应该由预处理器转换的编译器糖,而不是实际的代码生成,但我的问题是:

  1. 您认为在 c# 源文件中查找具有给定属性的方法、解析参数类型和返回类型并生成与此指纹匹配的委托(delegate)的最佳方法是什么
  2. 在不实际覆盖我的代码的情况下,将其集成到构建过程中的最佳方式是什么。是否可以在将源文件传递给编译器之前对其进行一些预处理?

感谢所有想法。

更新:

我按照 Shay 的建议研究了 Postsharp 库,它似乎非常适合非时间关键型应用程序(如事务管理、跟踪或安全性)的工作。

然而,当在时间关键的上下文中使用它时,事实证明它比委托(delegate)慢很多。每次实现斐波那契示例的一百万次迭代导致运行时间慢 80 倍。 (每次调用 0.012ms postsharp 与 0.00015ms delegate)

但老实说,在我打算使用它的上下文中,结果是完全可以接受的。感谢您的回复!

更新2:

显然 Postsharp 的作者正在努力研究 release 2.0其中将包括生成代码的性能改进和编译时间等。

最佳答案

关于c# - 如何将管道代码注入(inject)/生成用属性装饰的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1517206/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com