【问题标题】:Name of a property as input to attribute constructor属性名称作为属性构造函数的输入
【发布时间】:2015-09-02 11:04:57
【问题描述】:

我有一个自定义属性,我希望它有一个属性的名称作为输入。因为名称是一个字符串,所以它是一个有效的输入类型(因为属性对于它们可以作为构造函数的输入是非常有限的)。 但是我怎样才能做到这一点呢?

以这个示例代码为例:

public class MyCustomAttribute : Attribute {
    public MyCustomAttribute(string propertyName) {}
}

public class Foo {
    public bool MyCustomProperty { get; set; }

    [MyCustom(SomeMagicAppliedToMyCustomProperty)] // I want the attribute to receive something along the lines of "Foo.MyCustomProperty"
    public void Bar();
}

如何在属性可以在其构造函数中接收的限制的情况下完成此操作?

【问题讨论】:

  • 您是说要传入 属性的名称 而不对字符串进行硬编码,还是要传入 存储在属性中的值(这不可能发生,因为这是编译时的事情)
  • 为什么不只是在方法中施展魔法呢?
  • @JamesThorpe 我想传递 属性的名称 而不对字符串进行硬编码。
  • 我能看到的第一个绊脚点是,如果属性位于不同的属性上,它应该如何知道它所指的属性。如果你有关于如何计算属性的规则,那么有什么理由不在你的属性中包含它们以节省传递任何东西的需要吗?
  • 你想解决什么问题?

标签: c# .net .net-attributes


【解决方案1】:

c#-6.0 nameof() 中有一个新功能,可以将特定属性、变量、类等的名称作为字符串给出,

http://www.c-sharpcorner.com/UploadFile/7ca517/the-new-feature-of-C-Sharp-6-0-nameof-operator/ https://msdn.microsoft.com/en-us/magazine/dn802602.aspx

【讨论】:

  • 我阅读了您提供的链接,似乎nameof() 只会给出属性的名称(“MyCustomProperty”),而不是完全限定的名称(“Foo.MyCustomProperty”)。你知道nameof() 是否有一些扩展可以给出全名?
  • 你可以参考这个线程使用反射传递全名stackoverflow.com/questions/2308020/…
【解决方案2】:

这是不可能的。 属性只能接受常量,只需将您的 MyCustomProperty 名称放在 Attribute 的引号中即可。

【讨论】:

  • 尽管其他答案中已经描述了一些解决方法,但它们有一些我无法忍受的限制。所以这是最正确的答案。
【解决方案3】:

您也可以使用 CallerMemberNameAttribute https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.callermembernameattribute.aspx

public CustomAttribute([CallerMemberName] string propertyName = null)
{
    // ...
}

【讨论】:

    【解决方案4】:

    我已经在 C#6 的 MVC5 应用程序中使用了它

    private const string jobScheduleBindingAllowed = nameof(JobSchedule.JobId) + ", " + nameof(JobSchedule.Time) + ", " + nameof(JobSchedule.EndTime) + ", " + nameof(JobSchedule.TimeZoneId);
    

    那么当我要指定对模型有效的绑定时:

    [HttpPost]
    public ActionResult CreateJobSchedule([Bind(Include = jobScheduleBindingAllowed)]JobSchedule jobSchedule)
    {
        // stuff
    }
    

    有点麻烦,但比到处都有魔术字符串要好,而且类型安全,因此可以在编译时捕获由于重命名引起的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      • 2021-04-19
      • 2022-12-16
      相关资源
      最近更新 更多