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

时间:2015-06-17 09:35:44

标签: c# .net .net-attributes

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

以此示例代码:

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

如何通过属性在构造函数中可以获得的限制来实现此目的?

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

我在使用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
}

稍微麻烦但比在任何地方都使用魔术字符串更好并且类型安全,因此可以在编译时捕获由于重命名引起的错误。