2013-06-05 17 views
12

Tôi đang chơi với ScriptCS (thật tuyệt vời!) Nhưng tôi không thể tìm ra được cách cách xác định phương thức tiện ích trong tệp tập lệnh .csx.Cách xác định phương pháp mở rộng trong tập lệnh scriptcs csx

Hãy ví dụ này:

using System.IO; 

public static class Extensions 
{ 
    public static string Remove(this string source, params string[] toRemove) 
    { 
     foreach(var r in toRemove) 
     { 
      source = source.Replace(r,""); 
     } 
     return source; 
    } 
} 

string[] entries = 
    Directory 
     .GetFiles(
      @"C:\Users\blah\blah", 
      "*.mp4", 
      SearchOption.AllDirectories) 
    .Select(p => p.Remove("Users")) 
    .ToArray(); 

foreach(var e in entries) 
{ 
    Console.WriteLine(e); 
} 

này mang lại các lỗi:

error CS1109: Extension methods must be defined in a top level static class; Extensions is a nested class

Tôi đoán rằng ScriptCS kết thúc tốt đẹp CSX trong một số lớp học mà đang gây ra phần mở rộng được lồng nhau, là có bất kỳ cách này?

+1

Đây là một hạn chế trong Roslyn. Xem: http://social.msdn.microsoft.com/Forums/en-US/roslyn/thread/7c0a18eb-d37a-40e2-a26c-edb59b8f5cf3/. Vì vậy, hiện tại bạn không thể xác định các phương thức mở rộng trong các tệp '.csx'. Bạn cần phải đặt chúng trong một dll và tham khảo dll đó. – nemesv

+0

@nemesv this look answer-worthy =) Cảm ơn bạn – TJB

Trả lời

18

Tôi cảm thấy đau đớn của bạn.

Thực ra đây là một hạn chế của Roslyn hiện tại khi nó kết thúc mọi thứ vào một lớp ngay cả khi đó là một lớp khác.

Tuy nhiên, tôi đã nói chuyện với nhóm Roslyn và họ sẽ sớm hỗ trợ các phương pháp mở rộng.

+2

Chạy vào vấn đề này 3 năm sau: chúng ta nên diễn giải từ "sớm" như thế nào? – fra

+0

Đó là một câu hỏi hay. Chúng tôi sắp cập nhật lên phiên bản mới nhất của Roslyn (2.0). Tôi sẽ tìm hiểu xem điều đó có thêm hỗ trợ cho các phương thức mở rộng trong csx hay không. –

+0

Cảm ơn bạn đã cập nhật – fra

2

Thật không may, vì biên soạn một thứ gì đó đang bay đòi hỏi một lớp, scriptcs được thiết kế để lấy mã thô quan trọng và bọc nó trong một lớp. Bạn cần phải sửa đổi phiên bản scriptcs cho các nhu cầu của mình -hoặc xem xét contributing to the project.

Tuy nhiên, tôi cũng quá yêuscriptcs và nghĩ rằng đây là một trong những dự án tuyệt vời nhất hiện có!

Tôi cũng đã thử điều này sớm khi sử dụng scriptcs và trái tim tôi đã vỡ khi không hoạt động. Nếu tôi có thêm băng thông, tôi sẽ tự mình đóng góp phần bổ sung này.

AFAIK đây không phải là hạn chế với Roslyn.

+1

Đó là một hạn chế trong API kịch bản lệnh Roslyn. –

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