2015-06-17 127 views
2

我有一個自定義屬性,我希望它有一個屬性的名稱作爲輸入。因爲這個名字是一個字符串,所以它是一個有效的輸入類型(因爲屬性對於它們的構造函數可以有什麼輸入是非常有限的)。 但我怎麼能做到這一點?作爲輸入屬性構造函數的屬性名稱

拿這個例子代碼:

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

你是說你想傳遞property_的_name而不是硬編碼字符串,或者你是否試圖傳入存儲在property_中的_value(這不會發生,因爲這是編譯時的事情) –

+0

爲什麼不只是在方法上做魔術? – danish

+0

@JamesThorpe我想傳遞property_的_name而不用硬編碼字符串。 – GTHvidsten

回答

3

這是不可能的。 這些屬性只能接受常量,只需將MyCustomProperty名稱用引號括入屬性。

+0

儘管在其他答案中已經介紹了一些解決方法,但它們有一些我無法忍受的限制。所以這是最正確的答案。 – GTHvidsten

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

+0

我讀了你提供的鏈接,看起來'nameof()'只會給出屬性名稱(「MyCustomProperty」),而不是完全限定名稱(「Foo.MyCustomProperty」)。你知道是否有'nameof()'的擴展名可以給出全名嗎? – GTHvidsten

+0

您可以參考此線程使用反射傳遞全名http://stackoverflow.com/questions/2308020/can-c-sharp-attributes-access-the-target-class – samee

0

我已經與C#採用這種在MVC5應用6

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 
} 

略顯繁瑣,但不是處處有神奇的字符串更好,是類型安全的,這樣由於重命名錯誤可以被捕獲在編譯時。