我使用PostSharp的LocationInterceptionAspect
来拦截对类的字段和属性的调用。很明显,PostSharp在编译时更改了这样的类。然而,它阻碍了我的方式,问题并不仅仅与依赖于此功能的代码优雅有关。
即,我还使用lambda-expression来获取这些字段和属性的名称。这是一个简化的例子,用于演示:
namespace Example
{
using System.Linq.Expressions;
public class Data
{
public string Field;
public string Property { get; set; }
}
public class Process
{
public void Do()
{
string name1 = this.GetAttributeName<Data>(data => data.Field);
// name1 = "<Field>k_OriginalField"
string name2 = this.GetAttributeName<Data>(data => data.Property);
// name2 = "Property"
}
private string GetAttributeName<DECLARING_TYPE>(Expression<Func<DECLARING_TYPE, object>> expression)
{
return (expression.Body as MemberExpression)?.Member?.Name;
}
}
}
应该很明显:我希望&#34;&lt; Field&gt; k_OriginalField&#34;成为&#34; Field&#34;。可以在这里完成任何事情吗?
当然,我可以对这个字符串的格式做一些假设并解析出我想要的值,但这对我来说似乎有点难看。我确实需要保留字段定义并获得所示的名称(它们的目的比这里可见的要复杂得多)。由于Data.Field
显然存在(我通过反汇编验证),我不确定在内部使用.NET构建该lambda表达式的内容是什么,但它&#39}我被改成了一个房产,我想我已经被交给了一个支持领域,我对此感到困惑。
感谢您的时间。
编辑:我弄清楚为什么会发生这种情况(我之前忘记检查):PostSharp也会更改此&#34;字段的使用情况&#34;成员(但我还在质疑为什么),对此:string name1 = this.GetAttributeName<Data>(data => data.<Field>k_OriginalField);
// name1 = "<Field>k_OriginalField"
我发现这种用法替换很奇怪,因为PostSharp的拦截方面的重点是重定向执行流程(同时允许自定义执行控制),因此调整对这些更改的调用对我没有意义。 Data
和Process
类都在同一个程序集中;也许将它们分开可以解决问题,但我不能轻易做到这一点,而且 - 再次 - 它看起来很丑陋作为解决方案。我希望PostSharp团队能够对此发表意见。
答案 0 :(得分:1)
我不是PostSharp专家,但我不认为这是(大多数)一般情况下的可判定问题。
想一想。 PostSharp在构建时重写应用程序类型系统的一部分,通过它当时可以执行的任何静态分析,对于当时可到达的所有相关程序集,版本和命名空间。
它在将来看不到并决定哪些候选重写应该被省略,因为客户端调用站点需要在稍后会发生的构建中做出不同的假设,并且会查看相同的类型系统没有通过PostSharp的镜头看,或使用不同的镜头。
我认为,这就是必须假设所有重写,当它被调用时,它被指示要对你的类型进行调用,必须在任何适用的地方以类型安全的方式兑现。
只是我的直觉。
“HTH,