2013-05-23 26 views
8

Tôi có hai phương pháp sau đây mà tôi đang tự hỏi nếu họ là thích hợp:Phương pháp đặt tên cho getters/setters thuộc tính được chuẩn hóa trong IL?

public bool IsGetter(MethodInfo method) 
{ 
    return method.IsSpecialName 
     && method.Name.StartsWith("get_", StringComparison.Ordinal); 
} 

public bool IsSetter(MethodInfo method) 
{ 
    return method.IsSpecialName 
     && method.Name.StartsWith("set_", StringComparison.Ordinal); 
} 

Trong khi mã này làm việc, tôi hy vọng để tránh phần để kiểm tra các StartsWith và lập trình được quy ước đặt tên . Về cơ bản, có bất kỳ lớp học .NET 4.5 có thể xem nếu MethodInfo là một getter/setter thuộc tính không?

+1

Trong khi tôi cũng sẽ tránh được những chuỗi ma thuật, họ đang có trong thực tế được chuẩn hóa. –

Trả lời

13

Một phương pháp tài sản có ba đặc điểm thêm, so với phương pháp thông thường:

  1. Chúng luôn bắt đầu với get_ hoặc set_, trong khi phương thức bình thường CÓ THỂ bắt đầu bằng các tiền tố đó.
  2. Thuộc tính MethodInfo.IsSpecialName được đặt thành true.
  3. MethodInfo có thuộc tính tùy chỉnh System.Runtime.CompilerServices.CompilerGeneratedAttribute.

Bạn có thể kiểm tra 1, kết hợp với tùy chọn 2 hoặc 3. Vì tiền tố là tiêu chuẩn, bạn không nên lo lắng về việc kiểm tra.

Phương pháp khác là để liệt kê thông qua tất cả các thuộc tính và kết hợp các phương pháp, trong đó sẽ chậm hơn nhiều:

public bool IsGetter(MethodInfo method) 
{ 
    if (!method.IsSpecialName) 
     return false; // Easy and fast way out. 
    return method.DeclaringType 
     .GetProperties(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) 
     .Any(p => p.GetGetMethod() == method); 
} 
+0

Câu trả lời hay - Tôi đã được popping bởi để thêm một cái gì đó tương tự, nhưng bạn có nó được bảo hiểm. –

1

Bạn có thể thử như sau:

public bool IsGetter(MethodInfo method) 
{ 
    return method.DeclaringType.GetProperties(). 
           Any(propInfo => propInfo.GetMethod == method); 
} 

Bạn có thể tùy chọn chỉ định cờ ràng buộc cho GetProperties

+0

+1 (và nó là '.GetGetMethod()' trước .NET 4.5.) –

+0

Bây giờ, nó chỉ kiểm tra ví dụ và các thuộc tính công cộng. –

+0

@MartinMulder, xin lỗi, tôi không hiểu nhận xét của bạn? –

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