属性 的名称作为属性构造函数的输入

Name of a property as input to attribute constructor

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

拿这个例子代码:

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

我如何通过限制属性在其构造函数中接收的内容来完成此操作?

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

c#-6.0 nameof() 中有一个新功能,它以字符串形式给出特定 属性、变量、class 等的名称,

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

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

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

我已经在 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
}

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