4

我整晚都在想办法解决这个问题,但我想我对 .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 无论如何都会下沉它的钩子的要点)。

我不太确定的另一部分是如何检索传递给 ReplaceWithExpressionFrom 属性的特定实例化的类型参数(它装饰我要替换其主体的属性;换句话说,我如何获取 typeof (SomeOtherClass),我正在编码获取身体替换)。我计划从 IExpressionHolder 的具体实例缓存已编译的表达式,因为我不想在每次检索属性时都这样做。

我认为这必须成为可能。至少我认为我应该能够在程序集中搜索任何用该属性装饰的方法并以某种方式代理该类或只是替换 IL 或 .. 什么?而且我想让集成尽可能顺利,所以如果这可以在不显式调用注册或初始化方法的情况下完成,那将是非常棒的。

谢谢!

4

2 回答 2

2

也许我会为此投反对票,但是您为什么要为此购买财产?

您似乎想要的是一个虚拟电话。为什么不简单地继承 MyClass 并实现虚拟调用?

或者,您可以使用代表字典来进行适当的函数调用。

于 2010-06-17T06:35:36.353 回答
1

似乎不可能在运行时替换方法的实现。

它可以在编译时被替换,就像 PostSharp 对 IL 重写和编织所做的那样。

此外,生成的代理可以覆盖虚拟成员——尽管这需要通过一个集中点来创建对象,在该集中点可以分发代理来代替真实的东西(a la NHibernate)。

于 2010-12-22T19:40:19.963 回答