【发布时间】:2010-06-17 06:29:33
【问题描述】:
我整晚都在试图解决这个问题,但我想我对 .Net 框架的了解并不那么深入,而且问题也不完全是谷歌,但如果我能在正确的方向我确信我可以以一种或另一种方式实现它。
我希望能够声明一个用自定义属性装饰的属性:
public MyClass {
[ReplaceWithExpressionFrom(typeof(SomeOtherClass))]
public virtual bool MyProperty { get; }
}
public SomeOtherClass : IExpressionHolder<MyClass, bool> {
...
}
public interface IExpressionHolder<TArg, TResult> {
Expression<Func<TArg, TResult>> Expression { get; }
}
然后不知何故 - 这是我无法弄清楚的部分 - 用一段自定义代码替换自动生成的 getter 实现,例如:
Type expressionHolderType = LookupAttributeCtorArgTypeInDeclarationOfPropertyWereReplacing();
return ReplaceWithExpressionFromAttribute.GetCompiledExpressionFrom(expressionHolderType)(this);
我不知道该怎么做的主要事情是替换get的自动实现。
首先想到的是PostSharp,但这是一个比我关心的更复杂的依赖关系。我更喜欢一种不使用附加到构建的后处理来编写代码的方法(我认为这就是 PostSharp 无论如何都会下沉它的钩子的要点)。
我不太确定的另一部分是如何检索传递给 ReplaceWithExpressionFrom 属性的特定实例化的类型参数(它装饰我要替换其主体的属性;换句话说,如何我得到 typeof(SomeOtherClass) 我正在编码获取身体替换)。我计划缓存来自 IExpressionHolder 的具体实例的编译表达式,因为我不想在每次检索属性时都这样做。
我认为这只是得到成为可能。至少我认为我应该能够在程序集中搜索任何用该属性装饰的方法,并以某种方式代理该类,或者只是替换 IL 或 .. 什么?而且我想让集成尽可能顺利,所以如果这可以在不显式调用注册或初始化方法的情况下完成,那将是非常棒的。
谢谢!
【问题讨论】:
标签: .net linq lambda custom-attributes dynamic-programming