我有自定义属性,我希望它将属性的名称作为输入。因为名称是一个字符串,所以它是一个有效的输入类型(因为属性非常有限,因为它们可以作为构造函数的输入)。 但是我怎么能做到这一点?
以此示例代码:
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();
}
如何通过属性在构造函数中可以获得的限制来实现此目的?
答案 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
}
稍微麻烦但比在任何地方都使用魔术字符串更好并且类型安全,因此可以在编译时捕获由于重命名引起的错误。