2012-09-08 30 views
7

Làm cách nào để có được giá trị thuộc tính được thừa kế khi sử dụng sự phản chiếu? tôi cố gắng với BindingFlags nhưng vẫn kích hoạt NullReferenceExceptionLàm thế nào để có được giá trị của tài sản thừa kế bằng cách sử dụng sự phản ánh?

object val = targetObject.GetType().GetProperty("position", BindingFlags.FlattenHierarchy).GetValue(targetObject, null); 

position được iherited tài sản công cộng và có giá trị khai báo.

EDIT:

class myParent 
{ 
    public float[] position; 
    public myParent() 
    { 
     this.position = new float[] { 1, 2, 3 }; 
    } 
} 

class myChild : myParent 
{ 
    public myChild() : base() { } 
} 

myChild obj = new myChild(); 
PropertyInfo p = obj.GetType().GetProperty("position", BindingFlags.Instance | BindingFlags.Public); 

tôi đã cố gắng với một số kết hợp với BindingFlags nhưng p luôn là null :(,

+2

Bạn có thể đăng Lớp học có chứa thuộc tính được kế thừa không? –

+0

Hãy xem ngay bây giờ. – abuduba

+0

@abuduba xem câu trả lời cập nhật của tôi – nemesv

Trả lời

11

Nếu bạn sử dụng quá tải với BindingFlags bạn phải xác định rõ ràng tất cả các lá cờ gì bạn quan tâm

Cũng lưu ý rằng: (từ MSDN)

Bạn phải chỉ định BindingFlags.Instance hoặc BindingFlags.Static để nhận được lợi tức.

object val = targetObject.GetType() 
      .GetProperty("position", 
          BindingFlags.FlattenHierarchy | 
          BindingFlags.Instance | 
          BindingFlags.Public) 
      .GetValue(targetObject, null); 

EDIT:

Bạn có một positionlĩnh vực không phải là một tài sản!.

(Một nơi tốt để bắt đầu học phần chênh lệch: Difference between Property and Field in C# 3.0+ đặc biệt này answer)

Thay đổi của bạn position đến một bất động sản:

public float[] position { get; set; } 

Hoặc bạn sử dụng phương pháp targetObject.GetType().GetField(... để lấy lĩnh vực này.

1
BindingFlags.FlattenHierarchy 

chỉ hoạt động đối với thành viên tĩnh. Hãy chắc chắn chỉ định

BindingFlags.Instance | BindingFlags.Public 

và bạn sẽ nhận được các thuộc tính kế thừa.

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