2010-11-22 30 views
29

Xin lỗi, tôi đang tìm kiếm loại System.Type và loại PropertyInfo trong tài liệu nhưng tôi dường như không thể tìm thấy thứ tôi cần.Tìm hiểu xem một thuộc tính có được khai báo ảo

Làm cách nào để biết liệu thuộc tính (hoặc phương pháp hoặc bất kỳ thành viên nào khác) đã được khai báo là virtual trong lớp khai báo của nó?

Ví dụ:

class Cat 
{ 
    public string Name { get; set; } 
    public virtual int Age { get; set; } 
} 

Làm thế nào để tôi biết nếu Age tài sản được tuyên bố virtual hay không?

Trả lời

49

Bạn có thể sử dụng IsVirtual tài sản:

var isVirtual = typeof(Cat).GetProperty("Age").GetGetMethod().IsVirtual; 
+1

Điều này sẽ không thành công nếu thuộc tính được xem là chỉ ghi. – cdhowie

+0

Rất cám ơn câu trả lời. –

+1

@cdhowie, có nó sẽ thất bại. Tôi không bao gồm kiểm tra lỗi trong ví dụ của mình. –

17

Về mặt kỹ thuật, tài sản không phải là ảo - accessors của họ. Hãy thử điều này:

typeof(Cat).GetProperty("Age").GetAccessors()[0].IsVirtual 

Nếu bạn muốn, bạn có thể sử dụng một phương pháp khuyến nông như sau để xác định xem một tài sản là ảo:

public static bool? IsVirtual(this PropertyInfo self) 
{ 
    if (self == null) 
     throw new ArgumentNullException("self"); 

    bool? found = null; 

    foreach (MethodInfo method in self.GetAccessors()) { 
     if (found.HasValue) { 
      if (found.Value != method.IsVirtual) 
       return null; 
     } else { 
      found = method.IsVirtual; 
     } 
    } 

    return found; 
} 

Nếu nó trả null, hoặc là tài sản không có accessors (điều này sẽ không bao giờ xảy ra) hoặc tất cả các trình truy cập thuộc tính không có trạng thái ảo giống nhau - ít nhất một là và một không phải là ảo.

+1

+1 'GetAccessors()' là tốt hơn, rõ ràng. –

+0

Tôi đã sử dụng ** LINQ ** để giải quyết vấn đề: 'var isVirtual = prop.GetType(). GetProperties() .Where (x => x.GetAccessors(). Any (a => a.IsVirtual)); ' –

+0

@MichaelCeranski Lưu ý rằng điều này không làm điều tương tự như mã của tôi khi người truy cập có xung đột thuộc tính ảo. – cdhowie

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