2011-07-24 24 views
12

Có thể lặp qua một đối số hàm để kiểm tra xem có bất kỳ tham số nào không (hoặc kiểm tra chúng bằng hàm tùy chỉnh khác)? một cái gì đó như thế này:C# - Sử dụng foreach để lặp qua các đối số phương thức

public void test (string arg1, string arg2, object arg3, DataTable arg4) 
{ 
    foreach (var item in argus) 
     { 
      if(item == null) 
      { 
       throw; 
      } 
     } 
    // do the rest... 
} 

từ khóa chính xác cho "argus" là gì? Tôi biết rằng điều này là có thể bởi một số chi tiết câu lệnh if nhưng tìm kiếm một cách nhanh hơn ...

+0

Tôi nghĩ bạn sẽ cần phải nhìn vào sự phản chiếu. Những gì bạn đang cố gắng để làm dường như không có giá trị rắc rối so với cách tiếp cận đơn giản (đó là khá dễ dàng với cắt và dán). – hatchet

+0

Điều này có thể thực hiện một cách đơn giản trong các ngôn ngữ động và các ngôn ngữ được đánh máy tĩnh với sự hỗ trợ lập trình meta. Ví dụ, Nemerle có từ khóa NotNull trong thiết kế mặc định của nó bằng thư viện hợp đồng. –

+0

Tôi rất muốn khuyên bạn nên kiểm tra từng cá nhân và ném một ArgumentNullException với tên tham số cụ thể. Bạn có thể viết ra từng kiểm tra và ném vào một dòng, giảm thiểu mã bloat. Điều này mang lại nhiều phản hồi cụ thể hơn và không mất nhiều thời gian để viết. Bạn có thể sử dụng một đoạn mã nếu bạn muốn tiết kiệm thời gian và hầu hết các công cụ năng suất có cách để tiêm mã này (ví dụ, ReSharper có thể chèn các kiểm tra với một vài tổ hợp phím cho mỗi tham số.) Ngay cả với 'vanilla' Visual Studio, Tự động hoàn thành làm cho văn bản này bằng tay yêu cầu tổ hợp phím khá tối thiểu. –

Trả lời

6

Tôi cho rằng bạn không muốn thay đổi để params mỗi phương pháp trong (các) dự án của bạn. Bạn có thể sử dụng PostSharp, nhưng có các phương pháp khác, phụ thuộc vào khung công tác của bạn.

using System; 
using System.Data; 
using System.Reflection; 
using PostSharp.Aspects; 

namespace TestAOP 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      SomeClass someInstance = new SomeClass(); 
      someInstance.test(null, null, null, null); 
     } 
    } 


    public class SomeClass 
    { 
     [CheckForNulls] 
     public void test(string arg1, string arg2, object arg3, DataTable arg4) 
     {   
      // do the rest... 
     } 
    } 
    [Serializable] 
    public class CheckForNullsAttribute : OnMethodBoundaryAspect 
    { 
     public override void OnEntry(MethodExecutionArgs args) 
     { 
      ParameterInfo[] parameters = args.Method.GetParameters();    
      for (int i = 0; i < args.Arguments.Count; i++) 
      { 
       if (args.Arguments[i] == null) 
        throw new ArgumentNullException(parameters[i].Name); 
      } 
     } 
    } 
} 

http://www.sharpcrafters.com/ để nhận PostSharp, bạn cũng có thể tìm tài liệu ở đó.

+1

Câu hỏi: AOP là gì? – Sam

+0

http://en.wikipedia.org/wiki/Aspect-oriented_programming –

+0

+1 cho giải pháp AOP tốt đẹp, theo cách này bạn có thể ném đối số ArgumentNullException với tên chính xác, nếu chỉ MS sẽ thêm số này vào .Net ... –

5

Nếu bạn muốn một cách dễ dàng để lặp qua đối số, bạn nên suy nghĩ về việc sử dụng từ khóa params

public void test (params object args[]) 
{ 
    foreach(var argument in args) 
    { 
     if(item == null) 
     { 
      throw new ArgumentNullException(); 
     } 
    } 
} 

Ngoài ra, bạn có thể sử dụng sự phản chiếu, nhưng có vẻ như bạn không cần nó một cách tồi tệ

13

Bạn có thể sử dụng từ khóa params để lặp qua tất cả các đối số nhưng sau đó bạn sẽ sử dụng loại của chúng trong chính phương thức đó. Tôi sẽ viết một hàm tiện ích để kiểm tra null.

public void CheckForNullArguments(params object[] args) 
{ 
    foreach (object arg in args) 
     if (arg == null) throw new ArgumentNullException(); 
} 

Bạn có thể gọi đây là lúc bắt đầu của phương pháp của bạn như

CheckForNullArguments(arg1, arg2, arg3, arg4); 
3

Các LINQ cách:

public static void Test(params object[] args) 
{ 
    if (args.Any(a => a == null)) 
    { 
     throw new ArgumentNullException("args"); 
    } 
} 
Các vấn đề liên quan