2013-07-24 31 views
8
using System; 

class Runner 
{ 
    static void Main() 
    { 
     A a = new A(); 
     // how to say a.PrintStuff() without a 'using' 
     Console.Read(); 
    } 
} 

class A { } 

namespace ExtensionMethod 
{ 
    static class AExtensions 
    { 
     public static void PrintStuff(this A a) 
     { 
      Console.WriteLine("text"); 
     } 
    } 
} 

Làm cách nào để gọi phương thức mở rộng mà không có 'sử dụng'? Và không phải ExtensionMethod.AExtensions.PrintStuff (a), vì nó không sử dụng phương thức mở rộng.Cách gọi một phương thức tiện ích mở rộng mà không cần sử dụng

+6

Tại sao bạn phản đối việc thêm tuyên bố sử dụng? –

+0

Với mã của bạn như là, bạn có thể không. Lấy làm tiếc. Trình biên dịch C# cần biết nơi để tìm phương thức mở rộng. Nếu nó nằm trong một không gian tên riêng biệt, bạn cần 'sử dụng', không có cách nào xung quanh nó. – rossipedia

+0

Tôi cho rằng bạn có thể gọi phương thức mở rộng tĩnh theo cách thủ công và chuyển đối tượng đó làm đối số đầu tiên, nhưng điều đó khó có thể là cải tiến so với chỉ nhập không gian tên. – David

Trả lời

5

Cần số using để biết vị trí của hàm. Một ví dụ về điều này trong LINQ. Nếu không có System.Linq sử dụng - bạn sẽ không có linq được kích hoạt cho bất kỳ IEnumerable<T>' s

Tuy nhiên, bạn có thể xác định phương thức mở rộng trong cùng một không gian tên như người gọi để tránh sử dụng. Cách tiếp cận này sẽ tuy nhiên không hoạt động nếu nó cần thiết trong nhiều không gian tên

11

đó là có thể nếu Phương pháp mở rộng và lớp A trong cùng một không gian tên,

Nếu bạn phải sử dụng không gian tên khác nhau sau đó bạn đã sử dụng using, i don' t nghĩ rằng có một cách để làm điều này mà không cần using. Nhưng bạn có thể giảm số lượng các using bằng cách đặt tất cả các phần mở rộng trong một không gian tên như cho LINQ (System.Linq.Extensions)

Lưu ý: Bạn có thể loại bỏ các không gian tên cho các phương pháp mở rộng, sau đó nó sẽ làm cho họ có sẵn trên toàn cầu

+5

+1 cho "ghi chú", ý tưởng rất hay. –

+2

thậm chí không biết không gian tên là không cần thiết :) –

3

Điều này làm cho tôi cảm thấy dơ bẩn, nhưng bạn có thể đặt các phương thức mở rộng của bạn trong không gian tên System. namespace này được bao gồm theo mặc định trong câu hỏi của bạn

using System; 

class Runner 
{ 
    static void Main() 
    { 
     A a = new A(); 
     // how to say a.PrintStuff() without a 'using' 
     Console.Read(); 
    } 
} 

class A { } 

namespace System 
{ 
    static class AExtensions 
    { 
     public static void PrintStuff(this A a) 
     { 
      Console.WriteLine("text"); 
     } 
    } 
} 
2

suy ngẫm về việc tạo ra các phương pháp khuyến nông cho một loại ExtendableType:

  • Tên lớp ExtendableTypeExtensions
  • Khai báo lớp mở rộng một phần để khách hàng có thể thêm các phương thức mở rộng theo cùng một mẫu; và
  • Đặt phương pháp khuyến nông trong không gian tên tương tự như các loại cơ sở

trừ bạn có một lý do rất tốt để làm theo một mô hình tương tự như của LINQ:

  • Một đáng kể gia đình của các phương pháp khuyến nông,
  • Tất cả đều áp dụng cho nhiều lớp cơ sở.
0

Trong các tiện ích mở rộng dự án của chúng tôi được đặt trong cùng một không gian tên như tiện ích mở rộng lớp cho. Ví dụ của bạn:

A.cs: 
using System; 
namespace ANamespace 
{ 

    class A { } 
} 

AExtensions.cs: 
namespace ANamespace 
{ 
    static class AExtensions 
    { 
     public static void PrintStuff(this A a) 
     { 
      Console.WriteLine("text"); 
     } 
    } 
} 

Bây giờ khi bạn thêm using cho ANamespace cho việc sử dụng lớp A, tất cả các phần mở rộng cho A lớp sẽ được bao gồm quá.

8

Có thể trực tiếp gọi mở rộng của bạn như vậy vì nó chỉ đơn giản là một phương pháp tĩnh, đi qua các ví dụ nó sẽ hoạt động trên là this tham số đầu tiên:

A a = new A(); 
ExtensionMethod.AExtensions.PrintStuff(a); 

Điều này có thể gây nhầm lẫn cho các nhà phát triển khác, những người xảy ra trên mã này nếu bạn theo mẫu này cho các phương thức mở rộng thường được sử dụng hơn. Nó cũng sẽ làm cho chuỗi cuộc gọi mở rộng như LINQ xuất hiện giống như một ngôn ngữ chức năng bởi vì bạn sẽ làm tổ mỗi cuộc gọi thay vì chuỗi chúng.

+0

Phương pháp này hoạt động tuyệt vời khi bạn không muốn nhập một không gian tên có nhiều xung đột với các không gian tên khác mà bạn đã nhập. – humbads

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