2011-09-12 35 views
5

Tôi đang học các khái niệm phản xạ trong C#. Tôi có một lớp học như thế nàyCâu hỏi đơn giản: Những phản ánh trong C#

public class pdfClass 
{ 
    public List<AttributeProperties> TopA { get; set; } 
    public List<AttributeProperties> TopB { get; set; } 
    public List<AttributeProperties> TopC { get; set; } 

} 

Ở một lớp khác tôi muốn trích xuất các giá trị từ danh sách. Tôi có những cách ngu ngốc để làm điều đó như

public void ExtractValue (pdfClass incomingpdfClass, string type) 
{ 
switch (type) 
{ 
    case "TopA": 
    foreach (var listitem in incomingPdfClass.TopA) 
    {...} 
    breaks; 
    case "TopB": 
    foreach (var listitem in incomingPdfClass.TopB) 
    {...} 
    breaks; 
    ... 
} 
} 

Các hoạt động trong vòng lặp foreach tương tự. Làm thế nào tôi có thể làm điều này một cách rõ ràng bằng cách sử dụng phản xạ?

+2

Tại sao bạn sẽ sử dụng phản ánh cho điều này ? –

+2

Câu hỏi này không rõ ràng. Mã bạn đăng, cụ thể là ví dụ thứ hai, sẽ không biên dịch (một câu lệnh switch không thể ở trong một lớp). Trong lớp ExtractValue, làm thế nào bạn nhận được các tham chiếu đến các thuộc tính TopA, TopB, vv? Liệu nó kế thừa từ pdfClass? Chúng ta cần một ví dụ tốt hơn để bắt đầu. –

+0

@Seen: Bạn có một phiên bản pdfClass không? – sll

Trả lời

7
public void ExtractValue(pdfClass incomingpdfClass, string type) 
{ 
    PropertyInfo pinfo = typeof(pdfClass).GetProperty("Top" + type); 
    var yourList = pinfo.GetValue(incomingpdfClass); 
    foreach (var listitem in yourList) 
    { ... } 
} 

Đây là cách bạn nên làm điều này bằng cách sử dụng sự phản chiếu. Tuy nhiên, bạn nên lưu ý rằng mã của tôi khác với mã của bạn trong thực tế là bạn đang viết mã không rõ ràng và cũng không biên dịch được. AS

public class ExtractValue (pdfClass incomingpdfClass, string type) 

là phi C# cú pháp hợp lệ nếu điều đó được coi là một hàm theo ví dụ của tôi điều này sẽ làm việc cho bạn

Hoặc nếu điều này là vụ xảy ra trong Constructor cho lớp nó nên nhìn như sau

public class ExtractValue 
{ 
    public ExtractValue(pdfClass incomingpdfClass, string type) 
    { 
    PropertyInfo pinfo = typeof(pdfClass).GetProperty("Top" + type); 
    var yourList = pinfo.GetValue(incomingpdfClass); 
    foreach (var listitem in yourList) 
    { ... } 
    } 
} 
+0

Cảm ơn câu trả lời của bạn ... Tôi đã cố gắng làm cho nó rõ ràng hơn trong câu hỏi của tôi. – Seen

+0

@ Nhìn thấy mã của bạn vẫn không hợp lệ, nhưng tôi đang mở rộng ví dụ của tôi để giúp – msarchet

+0

Cảm ơn bạn rất nhiều .... đã không được đăng trên stackoverflow trong một thời gian dài và thực hiện rất nhiều sai lầm ngu ngốc. – Seen

1
var property = this.GetType().GetProperty(type); 
foreach (var item in (List<AttributeProperties>)property.GetValue(this, null)) 
{ 

} 
1

Nếu bạn có thể hiện của pdfClass bạn không cần phải sử dụng phản ánh để truy cập vào danh sách. tôi sẽ đề nghị để tách loại từ bản thân chiến lược bởi sự bền bỉ một cuốn từ điển như:

IDictionary<string, Func<pdfClass, AttributeProperties, bool>> strategy; 

Khi thêm các mối quan hệ như

strategy.Add("TopA", (pdf, item) => 
       { 
       return pdf.TopA.IndexOf(item) >= 0; 
       }); 

và sử dụng như

string itemType = "TopA"; 
if (strategy.ContainsKey(itemType)) 
{ 
    bool found = strategy[itemType](incommingPdfClass, listItem); 
} 
+0

Cảm ơn! Tôi sẽ thử theo cách này sau. – Seen

+0

@Seen: shout ở đây trong trường hợp có bất kỳ câu hỏi nào – sll