2010-03-18 42 views
5

Tôi đã tạo một Thuộc tính, gọi MyAttribute, đang thực hiện một số bảo mật và vì một lý do nào đó mà Constructor không bị sa thải, bất kỳ lý do gì?Lớp thuộc tính không gọi hàm tạo

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

Trả lời

1

Thực tế nó không thành công, nhưng chỉ khi bạn đang cố gắng để có được thuộc tính thuộc tính. Dưới đây là ví dụ không thành công:

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

Vì vậy, bây giờ bạn có thể nhận được mã của bạn để ném một ngoại lệ. Nhưng điều đó có ngăn cản bạn gọi chính phương thức đó không? –

+0

Tôi đồng ý rằng không có bất kỳ hành vi nào trong Thuộc tính. Nhưng câu hỏi đặt ra là tại sao ngoại lệ không xảy ra trong đoạn mã trên và câu trả lời là - bởi vì cá thể của lớp thuộc tính được tạo ra khi bạn cố truy cập nó. –

8

Thuộc tính được áp dụng tại thời gian biên dịch và các nhà xây dựng chỉ được sử dụng để điền vào các thuộc tính. Thuộc tính là siêu dữ liệu và chỉ có thể được kiểm tra khi chạy.

Thực tế, Thuộc tính không được chứa bất kỳ hành vi nào.

+0

Nếu trường hợp này xảy ra, cách khác có thể đặt tính bảo mật của phương pháp? – Coppermill

+0

Đó là một chủ đề hoàn toàn khác, nhưng bạn có thể muốn xem Mã Bảo mật Truy cập. –

+0

Tôi sẽ không khuyên bạn nên CAS vì nó là rất phức tạp để có được quyền và đã không được chấp nhận trong .Net 4.0. – adrianbanks

Các vấn đề liên quan