我整晚都在想办法解决这个问题,但我想我对 .Net Framework 的了解并不那么深入,而且问题并不完全是谷歌,但如果我能在正确的方向上点头,我我确信我可以以一种或另一种方式实现它。
我希望能够声明一个用自定义属性装饰的属性,如下所示:
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 无论如何都会下沉它的钩子(Hook)的要点)。
我不太确定的另一部分是如何检索传递给 ReplaceWithExpressionFrom 属性的特定实例化的类型参数(它装饰我要替换其主体的属性;换句话说,我如何获取 typeof (SomeOtherClass),我正在编码获取 body 替换)。我计划从 IExpressionHolder 的具体实例缓存已编译的表达式,因为我不想在每次检索属性时都这样做。
我想这只是 得到成为可能。至少我认为我应该能够在程序集中搜索任何用该属性装饰的方法,并以某种方式代理该类,或者只是替换 IL 或 .. 什么?而且我想让集成尽可能顺利,所以如果这可以在不显式调用注册或初始化方法的情况下完成,那将是非常棒的。
谢谢!
最佳答案
也许我会为此投反对票,但是您为什么要为此购买属性(property)?
您似乎想要的是一个虚拟电话。为什么不简单地继承 MyClass 并实现虚拟调用呢?
或者,您可以使用代表字典来进行适当的函数调用。
关于.net - 如何在运行时或编译时替换自动实现的 c# get body?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3059377/