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

时间:2015-04-02 13:33:03

标签: c# .net callermembername

可以创建一个行为类似于CallerMemberNameAttribute

的属性

我的意思是,我用google搜索并找到了this article,其中说CallerMemberName是属于CompilerServices组的属性,换句话说,这些属性改变了编译器构建我的IL的方式。因此,如果不自定义c#编译器,就无法复制此行为。

但我还不相信。我有一些希望,stackoverflow中的某个人可以说不然。所以这个问题就是为了它。

某些背景信息:

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

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; } }

有人可以帮助我吗?它有可能吗?

1 个答案:

答案 0 :(得分:2)

  

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

的属性

基本上只能自己更改C#编译器。毕竟,您要求的行为类似于C#编译器具有特定知识和代码处理的行为 - 因此您应该期望C#编译器需要特定的知识和代码来处理您的类似情况。

  

现在我的目标是存档这样的:

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

有人可以帮助我吗?它有可能吗?

没有开箱即用,没有。

选项:

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