实现具有与CompilerServices.CallerMemberAttribute类似行为的属性



是否可以创建一个行为类似于CallerMemberNameAttribute的属性?

我的意思是,我在谷歌上搜索了这篇文章,文章说CallerMemberName是属于CompilerServices组的一个属性,或者换句话说,这个属性改变了编译器构建IL的方式。因此,如果不自定义c#编译器,就不可能复制这种行为。

但我还不相信。我有一些希望,斯塔克夫弗洛的某个人可以说不同的话。所以这个问题是针对它的。

某些上下文:

我搜索这个主要是为了改进这个代码:

public int Prop
{
    { get { return (int)this["prop"]; }
    { set { this["prop"] = value; }
}

我的应用程序中有许多类,它们是一个字典,并且有一个表示特定键的属性。

使用StackTrace(在C#4.0中)和CallerMemberName(在C#5.0中),我能够将我的代码更新为:

public int Prop
{
    { get { return Get(); }
    { set { Set(value); }
}

现在我的目标是归档一些像这样的:

public int Prop { { [DicGet]get; [DicSet]set; } }

有人能帮我吗?有可能吗?

可以创建一个行为类似于CallerMemberNameAttribute的属性?

基本上只需要自己更改C#编译器。毕竟,你要求的行为类似于C#编译器有特定知识和代码要处理的事情——所以你应该预料到C#编译器需要特定知识和编码来处理你的类似情况。

现在我的目标是归档一些像这样的:

public int Prop { { [DicGet]get; [DicSet]set; } }

有人能帮我吗?有可能吗?

不是现成的,不是

选项:

  • 修改Roslyn编译器(它现在是开源的)——不过我不建议这样做
  • 使用PostSharp
  • 在编译之前使用某种预处理器
  • 改为使用动态类型(例如,扩展DynamicObject并以这种方式处理属性访问)

最新更新