【问题标题】:Is it possible to know whether a property's accessor is the default?是否有可能知道一个属性的访问器是否是默认的?
【发布时间】:2014-03-04 10:20:07
【问题描述】:

我使用的属性只能附加到具有默认访问器的属性, 我正在尝试以编程方式强制执行此编码约定。

这应该是有效的:

[Landing]
public int N {get; set;}

这应该是无效的:

[Landing]
public int N {get {return n;} set{n=value+1;}}

我如何才能检查代码是否有效,即使只是在运行时?

【问题讨论】:

  • 为什么你想要这种区别?特别是考虑public int N {get {return n;} set{n=value;}} - 自动实现版本的精确语义等价物。为什么我不能在上面指定属性?
  • 我认为这就是您要搜索的内容:stackoverflow.com/a/2210327/3047078
  • 我也认为这不是一个好主意。您不可能关心该属性是否是自动实现的;你关心的是另一回事。告诉我们这是什么以及为什么您认为这种检查是实现它的方法。
  • 我的目的是让 AutoMapper 忽略这些属性。使用 Automapper.IgnoreMap (=Landing) 属性是不知道 AutoMapper 配置选项以忽略带有 setter 的属性的解决方法。我同意这可能不是一个好主意。

标签: c# reflection


【解决方案1】:

我不认为你可以(没有令人发指的黑客攻击)。属性的全部意义在于隐藏 getter 和 setter 实现,所以它是隐藏的。

为什么后面的例子无效?也许你也可以处理它?如果没有,您是否考虑过使用公共字段而不是属性?这些将始终是标准的。

【讨论】:

  • 有可能,检查 CompilerGeneratedAttribute 引用的答案。后一个示例是有效的 C#,但在我的程序中应该是无效的(为歧义道歉,我现在已经澄清了这个问题)。由于序列化的方式,我仅限于使用属性而不是字段。
  • @user2046431,我想您可以在序列化例程中检查CompilerGeneratedAttributeLanding 属性。恕我直言,很难优雅,但有时​​我们别无选择,嘿:)。确保在不兼容的属性上获得 Landing 属性时抛出异常。
【解决方案2】:

对于自动属性,编译器只会为您生成支持字段,因此您可以在运行时发现自动属性并没有什么特别之处。

您可以尝试设置然后获取值以查看它是否相同,但这并不能证明实现中没有额外的代码。

例如,如果 setter 在存储值之前触发了一个事件,你可以吗?属性实现可以做很多完全有效的事情......

【讨论】:

  • 实际上有,在引用的答案中使用CompilerGeneratedAttribute。这只是为了强制执行编码约定:定义 getter 时,使用该特定属性。
猜你喜欢
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
  • 2022-01-05
  • 2018-06-21
相关资源
最近更新 更多