2009-09-09 22 views
5

như trong java Tôi có:Tôi có thể thay đổi trường thừa kế riêng chỉ đọc trong C# bằng cách sử dụng phản chiếu không?

Class.getSuperClass().getDeclaredFields() 

làm thế nào tôi có thể biết và thiết lập lĩnh vực tư nhân từ một lớp cha?

Tôi biết điều này không được khuyến khích, nhưng tôi đang thử nghiệm đơn đăng ký của mình và tôi cần mô phỏng tình huống sai khi id chính xác và tên không đúng. Nhưng Id này là riêng tư.

Trả lời

9

Vâng, chúng ta có thể dùng phản ánh để thiết lập giá trị của một lĩnh vực readonly sau khi các nhà xây dựng đã chạy

var fi = this.GetType() 
      .BaseType 
      .GetField("_someField", BindingFlags.Instance | BindingFlags.NonPublic); 

fi.SetValue(this, 1); 

CHỈNH SỬA

Được cập nhật để tìm trong loại gốc trực tiếp. Giải pháp này có thể sẽ có vấn đề nếu các loại là chung chung.

+0

nhưng, với mã này tôi không thể có được trường gốc. ổn thỏa? – Custodio

+0

@ Luís, đã cập nhật mã để tìm trong kiểu gốc – JaredPar

+0

u tại sao tôi chỉ có thể lấy trường của mình bằng cách sử dụng " k__BackingField"? – Custodio

1

Lớp này sẽ cho phép bạn làm điều đó:

http://csharptest.net/browse/src/Library/Reflection/PropertyType.cs

Cách sử dụng:

new PropertyType(this.GetType(), "_myParentField").SetValue(this, newValue); 

BTW, Nó sẽ làm việc trên các lĩnh vực công cộng/ngoài công lập hoặc tài sản. Để dễ sử dụng bạn có thể sử dụng các lớp có nguồn gốc PropertyValue như thế này:

new PropertyValue<int>(this, "_myParentField").Value = newValue; 
+0

+1 cho thư viện mạng csharptest. Nó có một logger thú vị. –

1

Có, bạn có thể.

Đối với các trường, sử dụng lớp FieldInfo. Tham số BindingFlags.NonPublic cho phép bạn xem các trường riêng tư.

public class Base 
{ 
    private string _id = "hi"; 

    public string Id { get { return _id; } } 
} 

public class Derived : Base 
{ 
    public void changeParentVariable() 
    { 
     FieldInfo fld = typeof(Base).GetField("_id", BindingFlags.Instance | BindingFlags.NonPublic); 
     fld.SetValue(this, "sup"); 
    } 
} 

và một thử nghiệm nhỏ để chứng minh nó hoạt động:

public static void Run() 
{ 
    var derived = new Derived(); 
    Console.WriteLine(derived.Id); // prints "hi" 
    derived.changeParentVariable(); 
    Console.WriteLine(derived.Id); // prints "sup" 
} 
0

Giống như JaredPar gợi ý, tôi đã làm sau:

//to discover the object type 
Type groupType = _group.GetType(); 
//to discover the parent object type 
Type bType = groupType.BaseType; 
//now I get all field to make sure that I can retrieve the field. 
FieldInfo[] idFromBaseType = bType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance); 

//And finally I set the values. (for me, the ID is the first element) 
idFromBaseType[0].SetValue(_group, 1); 

Nhờ tất cả.

+0

Bạn có chắc chắn rằng idFromBaseType [0] là trường đúng không? Có lẽ bạn nên so khớp theo tên ... –

+0

Đối với tôi hoạt động, nguyên nhân đầu tiên của tôi là ID. Nhưng tôi đã cố gắng lấy trường bằng chuỗi nhưng không thành công. – Custodio

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