2012-07-16 39 views
7

Tôi đã sau lớpđiển với đại biểu là giá trị

public class CVisitor : IVisitor 
    { 
     public int Visit(Heartbeat element) 
     { 
      Trace.WriteLine("Heartbeat"); 
      return 1; 
     } 
     public int Visit(Information element) 
     { 
      Trace.WriteLine("Information"); 
      return 1; 
     } 

    } 

Tôi muốn có một từ điển với ánh xạ, mà tất cả các loại tranh luận sẽ được ánh xạ tới đó là chức năng thực hiện: Heartbeat sẽ được ánh xạ tới public int Visit(Heartbeat element)

Tôi đã nghĩ phải làm điều gì đó như sau:

_messageMapper = new Dictionary<Type, "what should be here ?" >(); 
    _messageMapper.Add(typeof(Heartbeat), "and how I put it here?"); 

Tôi nên đặt gì thay vào đó "nên ở đây?" và "và cách tôi đặt nó ở đây?"

Cảm ơn

+1

Phương pháp của bạn trông như thế nào (nghĩa là chúng tương tự như định nghĩa?) –

+0

có thể, bạn có thể tạo phương thức làm Đại biểu và TValue trong Từ điển của bạn sẽ là System.Delegate .. bạn đã thử chưa? –

+0

@ Có một Geek khác, chức năng Visitor có thực hiện hoàn toàn khác nhau, chúng là những người lập bản đồ DTO –

Trả lời

7
new Dictionary<Type, Func<object, int>>(); 

var cVisitor = new CVisitor(); 
_messageMapper.Add(typeof(Heartbeat), 
    new Func<object, int>(heartbeat => cVisitor.Visit((Heartbeat)heartbeat)) 
); 
+0

tại sao bạn đang sử dụng Hành động? Tôi có giá trị trả về là –

+0

nếu cVisitor là cá thể của CVisitor cách tôi đăng ký nó với Func mới (heartbeat => (cVisitor.Visit (heartbeat)) –

+1

@NightWalker kiểm tra biến thể hiện tại –

2

Bạn có biết ActionFunc đối tượng? Có vẻ như những gì bạn đang tìm kiếm.

var d = new Dictionary<Type, Action>(); 
d.Add(typeof(HeartBeat),()=>Trace.WriteLine("todum todum")); 

PS: thx YAG

+1

Nếu bạn muốn làm theo cách này, thì nó phải là 'Hành động' và không phải là' Hành động 'vì không có đầu vào chuỗi nào được đưa ra –

0

cuộc gọi tốt nhất của bạn ở đây là sử dụng Reflection.
1. Nhận tất cả các phương thức của Lớp khách truy cập (Hoặc tất cả các phương thức được gọi là "Truy cập"?) ​​Với typeof (Khách truy cập) .GetMethods().
2. GetMethods trả về một IEnumerable của MethodInfo. GetParameters sẽ cung cấp cho bạn các tham số cho mỗi Phương thức.
3. Vì vậy, bây giờ bạn có thể xây dựng Dictionnary của bạn (Type, MethodInfo)
4. sử dụng Invoke để gọi phương thức.

Rq: Lợi thế của việc sử dụng phản chiếu là Dictionnary sẽ vẫn được cập nhật nếu bạn thêm phương thức mới. Không có nguy cơ quên để thêm một phương pháp.

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