【问题标题】:Implementing an attribute with similar behavior to CompilerServices.CallerMemberAttribute实现与 CompilerServices.CallerMemberAttribute 具有类似行为的属性
【发布时间】:2015-04-02 13:33:02
【问题描述】:

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

我的意思是,我用谷歌搜索并找到了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; } }

那么有人可以帮助我吗?有可能吗?

【问题讨论】:

    标签: c# .net callermembername


    【解决方案1】:

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

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

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

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

    那么有人可以帮助我吗?有可能吗?

    不是开箱即用的,不是。

    选项:

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

    【讨论】:

      猜你喜欢
      • 2014-02-12
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多