2008-10-05 29 views
6

Tôi đã không sử dụng generics nhiều và do đó không thể tìm ra nếu nó có thể biến ba phương pháp sau đây thành một bằng cách sử dụng generics để giảm trùng lặp. Trên thực tế mã của tôi hiện đang có sáu phương pháp nhưng nếu bạn có thể giải quyết nó cho ba thì phần còn lại chỉ nên làm việc dù sao với cùng một giải pháp.Làm thế nào để biến 3 phương thức này thành một phương pháp bằng cách sử dụng C# generics?

private object EvaluateUInt64(UInt64 x, UInt64 y) 
    { 
     switch (Operation) 
     { 
      case BinaryOp.Add: 
       return x + y; 
      case BinaryOp.Subtract: 
       return x - y; 
      case BinaryOp.Multiply: 
       return x * y; 
      case BinaryOp.Divide: 
       return x/y; 
      case BinaryOp.Remainder: 
       return x % y; 
      default: 
       throw new ApplicationException("error"); 
     } 
    } 

    private object EvaluateFloat(float x, float y) 
    { 
     switch(Operation) 
     { 
      case BinaryOp.Add: 
       return x + y; 
      case BinaryOp.Subtract: 
       return x - y; 
      case BinaryOp.Multiply: 
       return x * y; 
      case BinaryOp.Divide: 
       return x/y; 
      case BinaryOp.Remainder: 
       return x % y; 
      default: 
       throw new ApplicationException("error"); 
     } 
    } 

    private object EvaluateDouble(double x, double y) 
    { 
     switch (Operation) 
     { 
      case BinaryOp.Add: 
       return x + y; 
      case BinaryOp.Subtract: 
       return x - y; 
      case BinaryOp.Multiply: 
       return x * y; 
      case BinaryOp.Divide: 
       return x/y; 
      case BinaryOp.Remainder: 
       return x % y; 
      default: 
       throw new ApplicationException("error"); 
     } 
    } 

Tôi đang xây dựng một phân tích cú pháp biểu hiện đơn giản mà sau đó cần phải đánh giá các hoạt động nhị phân đơn giản như phép cộng/trừ vv Tôi sử dụng các phương pháp trên để có được những toán thực tế thực hiện bằng cách sử dụng các loại có liên quan. Nhưng phải có một câu trả lời tốt hơn!

Trả lời

9

Generics không hỗ trợ số học. Tuy nhiên, nó có thể được thực hiện với .NET 3.5, like so. Lớp Operator là một phần của MiscUtil. Điều này sau đó trở thành:

public T Evaluate<T>(T x, T y) { 
     switch (Operation) 
     { 
     case BinaryOp.Add: 
      return Operator.Add(x, y); 
     case BinaryOp.Subtract: 
      return Operator.Subtract(x, y); 
    ... etc 

Vì bạn đang viết trình phân tích biểu thức, bạn nên sử dụng Expression trực tiếp, nhưng bạn có thể sử dụng ở trên.

+0

Trái với suy đoán phổ biến, Marc và tôi thực sự là hai người riêng biệt. Chúng tôi dường như đôi khi chia sẻ một tâm trí. –

+0

Có lẽ chúng ta chỉ * nghĩ * rằng ... có bao giờ gặp Fight Club không? –

+0

Bộ não có thể thay đổi? Mát mẻ. – EricSchaefer

4

Marc Gravell đã thực hiện rất nhiều công việc để làm cho toán học chung có thể thực hiện được. Xem số MiscUtilgeneral article about the issue.

Mã trong phiên bản hiện tại của MiscUtil yêu cầu .NET 3.5 do việc sử dụng cây biểu thức. Tuy nhiên, tôi tin rằng Marc có phiên bản hoạt động với .NET 2.0. Nếu điều này sẽ hữu ích cho mọi người, tôi chắc chắn chúng ta có thể kết hợp nó bằng cách nào đó (có thể với một mặt tiền trong chính MiscUtil sẽ sử dụng việc triển khai thích hợp dựa trên phiên bản khung thời gian chạy).

Trong tương lai, tôi muốn xem static interfaces có thể cung cấp một cách thay thế để làm việc với các loại toán học chung chung.

+0

Tôi có lẽ cần phải làm lại 2.0 - Tôi nghĩ rằng nó đã chết trên một HDD, tôi e-mail cho bạn một bản sao một lần - không giả sử bạn Nó không phải là một số lượng lớn công việc, mặc dù ... –

+0

Tôi khá có thể có nó.Không thể kiểm tra bây giờ, nhưng sẽ xem xét sau này nếu bạn nhắc nhở tôi. –

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