2010-03-18 178 views
5

我已經創建了一個屬性,調用MyAttribute,這是執行一些安全性和由於某些原因,構造函數沒有被開除,有什麼理由?屬性類不調用構造函數

public class Driver 
{ 
    // Entry point of the program 
    public static void Main(string[] Args) 
    { 
     Console.WriteLine(SayHello1("Hello to Me 1")); 
     Console.WriteLine(SayHello2("Hello to Me 2")); 

     Console.ReadLine(); 
    } 

    [MyAttribute("hello")] 
    public static string SayHello1(string str) 
    { 
     return str; 
    } 

    [MyAttribute("Wrong Key, should fail")] 
    public static string SayHello2(string str) 
    { 
     return str; 
    } 


} 

[AttributeUsage(AttributeTargets.Method)] 
public class MyAttribute : Attribute 
{ 

    public MyAttribute(string VRegKey) 
    { 
     if (VRegKey == "hello") 
     { 
      Console.WriteLine("Aha! You're Registered"); 
     } 
     else 
     { 
      throw new Exception("Oho! You're not Registered"); 
     }; 
    } 
} 

回答

1

實際上失敗了,但只有當你正試圖獲得屬性的屬性。這是一個失敗的例子:

using System; 

public class Driver 
{ 
// Entry point of the program 
    public static void Main(string[] Args) 
    { 
     Console.WriteLine(SayHello1("Hello to Me 1")); 
     Console.WriteLine(SayHello2("Hello to Me 2")); 

     Func<string, string> action1 = SayHello1; 
     Func<string, string> action2 = SayHello2; 

     MyAttribute myAttribute1 = (MyAttribute)Attribute.GetCustomAttribute(action1.Method, typeof(MyAttribute)); 
     MyAttribute myAttribute2 = (MyAttribute)Attribute.GetCustomAttribute(action2.Method, typeof(MyAttribute)); 

     Console.ReadLine(); 
    } 

    [MyAttribute("hello")] 
    public static string SayHello1(string str) 
    { 
     return str; 
    } 

    [MyAttribute("Wrong Key, should fail")] 
    public static string SayHello2(string str) 
    { 
     return str; 
    } 


} 

[AttributeUsage(AttributeTargets.Method)] 
public class MyAttribute : Attribute 
{ 

    public string MyProperty 
    { 
     get; set; 
    } 

    public string MyProperty2 
    { 
     get; 
     set; 
    } 

    public MyAttribute(string VRegKey) 
    { 
     MyProperty = VRegKey; 
     if (VRegKey == "hello") 
     { 
      Console.WriteLine("Aha! You're Registered"); 
     } 
     else 
     { 
      throw new Exception("Oho! You're not Registered"); 
     }; 

     MyProperty2 = VRegKey; 
    } 
} 
+0

所以現在你可以讓你的代碼拋出異常。但這是否阻止你調用方法本身? – 2010-03-18 19:05:42

+0

我同意在屬性中有任何行爲是錯誤的。但問題是,爲什麼異常不會在上面的代碼發生,答案是 - 因爲當你試圖訪問創建它的屬性類的實例。 – 2010-03-18 19:21:57

8

屬性在編譯時應用,構造函數只用於填充屬性。屬性是元數據,只能在運行時檢查。

事實上,屬性不應該包含在所有的行爲。

+0

如果是這樣的話,還有什麼方法可以設置方法的安全性? – Coppermill 2010-03-18 13:57:28

+0

這是一個完全不同的話題,但你可能要看看代碼訪問安全性。 – 2010-03-18 14:00:48

+0

我不會推薦CAS,因爲它是非常複雜的,以得到正確的和在.NET 4.0中已被棄用。 – adrianbanks 2010-03-18 14:07:52