2010-06-10 39 views
11

Đây là giao dịch. Tôi đã có một chương trình mà sẽ tải một hội đồng nhất định, phân tích qua tất cả các loại và các thành viên của họ và biên dịch một TreeView (rất giống với trang MSDN cũ) và sau đó xây dựng các trang HTML cho mỗi nút trong TreeView. Về cơ bản nó có một hội đồng nhất định và cho phép người dùng tạo thư viện giống MSDN của riêng họ cho nó cho mục đích tài liệu. Đây là vấn đề tôi đã gặp phải: bất cứ khi nào một toán tử quá tải được đếm trong một lớp xác định, sự phản xạ trả về như là một "MethodInfo" với tên được đặt thành "op_Assign" hoặc "op_Equality". Tôi muốn có thể nắm bắt chúng và liệt kê chúng đúng cách, nhưng tôi không thể tìm thấy bất cứ điều gì trong đối tượng MethodInfo được trả về để xác định chính xác rằng tôi đang tìm kiếm một toán tử.Sự phản ánh và điều hành quá tải trong C#

Tôi chắc chắn không muốn chỉ chụp mọi thứ bắt đầu bằng "op_", vì điều đó chắc chắn nhất (ở một thời điểm nào đó) sẽ nhận được một phương thức mà nó không được yêu cầu. Tôi biết rằng các phương pháp và thuộc tính khác là "trường hợp đặc biệt" như trường hợp này có thuộc tính "IsSpecialName", nhưng không phải là trường hợp với các toán tử.

Tôi đã cọ rửa 'net và wracking não của tôi để hai ngày cố gắng để con số này ra, vì vậy bất kỳ trợ giúp sẽ được đánh giá rất nhiều.

+0

Dự án NRefactory có liên quan ở đây. Nó có phương pháp phân tích cú pháp để trợ giúp với điều này. https://github.com/icsharpcode/NRefactory/blob/master/ICSharpCode.NRefactory.CSharp/Parser/mcs/method.cs – yoyo

Trả lời

16

Quy ước đặt tên op_ là tiêu chuẩn chuẩn hoặc defacto cho .net. Khi phản ánh, tôi sẽ làm một cái gì đó như thế này:

public void GenerateDocForMethod(MethodInfo method) 
{ 
    if(method.Name.StartsWith("op_")) 
     GenerateDocForOperator(method); 
    else 
     GenerateDocForStandardMethod(method); 
} 

public void GenerateDocForOperator(MethodInfo method) 
{ 
    switch(method.Name) 
    { 
     case "op_Addition": 
     //generate and handle other cases... 

     //handle methods that just happen to start with op_ 
     default: 
      GenerateDocForStandardMethod(method); 
    } 
} 

public void GenerateDocForStandardMethod(MethodInfo method) 
{ 
    //generate doc 
} 

GenerateDocForOperator sẽ bật tất cả các toán tử quá tải (đừng quên chuyển đổi ngầm và rõ ràng). Nếu tên phương thức không phải là một trong các tên toán tử chuẩn, nó gọi hàm GenerateDocForStandardMethod. Tôi không thể tìm thấy một danh sách đầy đủ các tên của các toán tử nhưng tôi có thể cung cấp một danh sách đầy đủ nếu bạn thực sự cần nó.

EDIT: Dưới đây là một danh sách các tên phương pháp của các nhà khai thác overloadable (lấy từ http://forums.devx.com/showthread.php?55322-Operator-Overloading.....C-can-do-it....&p=208952#post208952):

op_Implicit
op_Explicit
op_Addition
op_Subtraction
op_Multiply
op_Division
op_Modulus
op_ExclusiveOr
op_BitwiseAnd
op_BitwiseOr
op_LogicalAnd
op_LogicalOr
op_Assign
op_LeftShift
op_RightShift
op_SignedRightShift
op_UnsignedRightShift
op_Equality
op_GreaterThan
op_LessThan
op_Inequality
op_GreaterThanOrEqual
op_LessThanOrEqual
op_MultiplicationAssignment
op_SubtractionAssignment
op_ExclusiveOrAssignment
op_LeftShiftAssignment
op_ModulusAssignment
op_AdditionAssignment
op_BitwiseAndAssignment
op_BitwiseOrAssignment
op_Comma
op_DivisionAssignment
op_Decrement
op_Increment
op_UnaryNegation
op_UnaryPlus
op_OnesComplement

+0

Đó là một ý tưởng tuyệt vời về cách xử lý nó, thực sự. Cảm ơn. Đoán tôi đã quá treo lên trên việc tìm kiếm một giá trị xác định để xác định các nhà điều hành. Ngẫu nhiên, tôi tự hỏi điều gì sẽ xảy ra nếu tôi thực hiện một lớp với một toán tử bổ sung quá tải * và * một phương thức ngẫu nhiên được gọi là "op_Addition". Tôi tự hỏi nếu trình biên dịch sẽ cho phép bạn làm điều đó?Nghe như một thử nghiệm trong vài phút tiếp theo với tôi :) Cảm ơn, một lần nữa. Xảy ra để biết nơi tôi có thể nhận được một danh sách của tất cả các giá trị op_XXXX có thể? –

+0

Tôi cũng gặp khó khăn khi tìm danh sách. Bạn đá :) –

+2

Mike U: Chỉ vì tôi tò mò về kết quả: Nó không biên dịch nếu bạn định nghĩa một phương thức được gọi là toán tử: Loại 'Foo' đã định nghĩa một thành viên có tên 'op_Addition' với cùng các kiểu tham số – NobodysNightmare

5

quá tải hành làm được cờ IsSpecialName thiết lập là true. Và nếu bạn triển khai các phương thức bằng cách cho chúng một cái tên như op_ * thì cờ đó được đặt thành false.

2

Để thêm bài của Wiser: cùng một sợi (http://forums.devx.com/showthread.php?55322-Operator-Overloading.....C-can-do-it....&p=208952#post208952) đề cập đến một số nhà khai thác thêm các nhà khai thác:

Some additions - see CLI Partition 1, section 10.3. 
op_UnsignedRightShiftAssignment 
op_RightShiftAssignment 
op_MemberSelection 
op_PointerToMemberSelection 
op_LogicalNot 
op_True 
op_False 
op_AddressOf 
op_PointerDereference 

Những nhà khai thác được nhìn thấy trong ngôn ngữ chung cơ sở hạ tầng cuốn sách Chuẩn chú thích: http://books.google.ru/books?id=50PhgS8vjhwC&pg=PA111&lpg=PA111&dq=op_PointerToMemberSelection&source=bl&ots=vZIC0nA9sW&sig=4hTfAAWGkaKirgBQ4I1yBnK_D2M&hl=en&sa=X&ei=YsB2ULvAMuHx4QT25YCYAw&ved=0CB0Q6AEwAA#v=onepage&q=op_PointerToMemberSelection&f=false

Một số tiện dụng bảng cũng có thể được tìm thấy ở đây: http://en.csharp-online.net/Common_Type_System%E2%80%94Operator_Overloading

+0

Lưu ý: tất cả những điều này có thể được sử dụng cho * một số ngôn ngữ * Khuôn khổ .NET, nhưng trong danh sách này trình biên dịch C# * chỉ * tận dụng lợi thế của các toán tử LogicalNot, True và False. Và nó thích 'toán tử bool' ngầm hơn đối với toán tử True và False, nếu cả hai được định nghĩa. – aboveyou00

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