2011-08-31 31 views
7

là nó có thể mở rộng truy vấn-từ khóa của LINQ (như: chọn, ở đâu, vv) với định nghĩa riêng?Có thể mở rộng Truy vấn-Từ khoá trong C#/LINQ không?

Codeexample để làm cho nó rõ ràng hơn:

System.Collections.Generic.List<string> aList = 
    new System.Collections.Generic.List<string> { "aa", "ab", "ba", "bb" }; 

// instead of 
string firstString = (from item in aList 
         where item.StartsWith("a") 
         select item).First(); 

// would be nice 
string firstString = from item in aList 
        where item.StartsWith("a") 
        selectFirst item; 

// or something else 
from item in aList 
where item.StartsWith("a") 
WriteLineToConsole item; 

Tôi nghĩ đó là không thể, nhưng vẫn hy vọng;)

+0

Bất kỳ lý do cụ thể nào bạn muốn thực hiện việc này? – AakashM

+0

Ba 400 nghìn người dùng đã trả lời câu hỏi của bạn. Đi, giết một con dê! – dotNET

Trả lời

6

Một cách để đạt được điều này sẽ được để viết một pre-bộ xử lý mà sẽ biến đổi tùy chỉnh của bạn LINQ từ khóa thành các từ khóa LINQ tiêu chuẩn trước khi cho nó vào trình biên dịch. Bằng cách đó là cách nó hoạt động với các từ khóa LINQ tiêu chuẩn. Một bộ xử lý trước chuyển đổi chúng thành các phương thức mở rộng bình thường (.Select, .Where, .GroupBy, ...), và sau đó nạp nó vào trình biên dịch mà không hiểu những từ khóa đó.

Tất nhiên bằng cách làm điều này bạn sẽ mất Intellisense, nhưng điều này có thể được giải quyết bằng cách viết một phần mở rộng Visual Studio. Có thể là khá nhiều công việc mặc dù cho đường này.

+1

Bạn có thể cung cấp một số điểm bắt đầu cho tiện ích mở rộng này không? – Matthias

+0

Biết rằng đó là một câu hỏi rất cũ, nhưng bạn đã quản lý để làm điều gì đó về các từ khóa tùy chỉnh? –

4

Không, không thể thực hiện trong thông số ngôn ngữ hoặc bất kỳ trình biên dịch C# hiện tại nào. Bất cứ thứ gì bạn tạo ở đó sẽ không còn (thuần) C#.

6

Bạn không thể thêm từ khóa theo ngữ cảnh của riêng mình, nhưng bạn có thể ảnh hưởng đến ý nghĩa của từ khóa hiện tại.

Ví dụ, mã này:

string firstString = (from item in aList 
         where item.StartsWith("a") 
         select item).First(); 

được hiệu quả xử lý trước để:

string firstString = aList.Where(item => item.StartsWith("a")) 
          .First(); 

... vì vậy nếu bạn thay đổi những gì những WhereFirst phương pháp các cuộc gọi có nghĩa là, bạn có thể ảnh hưởng đến hành vi .

Nếu bạn đã có dạ dày cho nó, bạn có thể muốn xem this Stack Overflow answer Tôi đã viết một lúc trước đây thay đổi hành vi của where trong LINQ thành đối tượng trong một số trường hợp nhất định. Đó là mã độc ác, mặc dù.

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