Name of a property as input to attribute constructor

我是研究僧i 提交于 2019-12-11 03:37:41

问题


I have a custom attribute and I would like it to have the name of a property as input. Because the name is a string it is a valid input type (as attributes are quite limited as to what they can have as input to their constructors). But how can I accomplish this?

Take this example code:

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

How can I accomplish this with the limitations to what an attribute can receive in its constructor?


回答1:


This is not possible. The attributes can accept only constants, just put your MyCustomProperty name in quotes into the Attribute.




回答2:


There's a new feature in c#-6.0 nameof() that gives the name of the particular property, variable, class etc as a string,

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




回答3:


You can also use CallerMemberNameAttribute https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.callermembernameattribute.aspx

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



回答4:


I've used this in an MVC5 application with C#6

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

Then when I want to specify the bindings that are valid for the model:

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

Slightly cumbersome but better than having magic strings everywhere and is type safe so that errors due to renames can be caught at compile time.



来源:https://stackoverflow.com/questions/30887743/name-of-a-property-as-input-to-attribute-constructor

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!