Tôi có một nhóm lớp tương tự mà tôi sử dụng cho việc này, nhúng văn bản tạo mẫu vào phần mềm.
Về cơ bản, nó hoạt động như ASP kiểu cũ, bạn bao quanh mã C# trong khối <%...%>
và bạn có thể phát ra kết quả bằng cách sử dụng <%= expression %>
.
Bạn có thể chuyển một đối tượng vào mã mẫu, tất nhiên có thể là bất kỳ loại đối tượng nào bạn thích hoặc đơn giản là một mảng tham số. Bạn cũng có thể tham khảo các hội đồng của riêng bạn nếu bạn muốn thực thi mã tùy chỉnh.
Sau đây là cách phát ra một lớp sẽ nhìn:
<%
var parameters = (string[])data;
var namespaceName = parameters[0];
var className = parameters[1];
%>
namespace <%= namespaceName %>
{
public class <%= className %>
{
}
}
Bạn có thể của vòng lặp nhiên qua điều:
<% foreach (var parameter in parameters) { %>
<%= parameter %>
<% } %>
và đặt mã trong if-khối, vv
Thư viện lớp được phát hành trên CodePlex tại đây:
cũng như trên NuGet.
Dự án đi kèm với các ví dụ, tải xuống nguồn hoặc browse it online.
Để trả lời câu hỏi qua email cũng ở đây, đối với những người khác để xem:
- Tất cả các loại mã C# đó phù hợp với một phương pháp gọi thể được biên dịch trong mẫu. Nó chạy mã C# 3.5 bình thường, với mọi thứ có nghĩa là, không có giới hạn nhân tạo. Chỉ có những điều cần biết là bất kỳ nếu, trong khi, cho, foreach, vv mã có chứa mã mẫu để phát ra phải sử dụng niềng răng, bạn không thể làm một dòng nếu-sau đó loại khối. Xem bên dưới để biết giới hạn cuộc gọi phương thức.
- Thông số
data
tương ứng với bất kỳ thông tin nào được chuyển vào làm tham số cho phương thức .Generate(x)
từ ứng dụng của bạn và có cùng loại. Nếu bạn chuyển vào một đối tượng mà bạn đã định nghĩa trong các thư viện lớp của riêng mình, bạn cần phải thêm một tham chiếu tới mã mẫu để truy cập đúng nó.(<%@ reference your.class.library.dll %>
)
- Nếu bạn sử dụng lại mẫu đã biên dịch, bản chất sẽ chỉ là một cuộc gọi phương thức cho một lớp, không thực hiện thêm phí trên thực tế cuộc gọi đến
.Generate()
. Nếu bạn không tự gọi số .Compile()
, cuộc gọi đầu tiên đến .Generate()
sẽ tự xử lý. Cũng lưu ý rằng mã chạy trong một appdomain riêng biệt, do đó, có một chút marshalling overhead liên quan đến việc sao chép các tham số và kết quả qua lại. Mã, tuy nhiên, chạy ở tốc độ mã JITted .NET bình thường.
Ví dụ về if-block:
<% if (a == b) { %>
This will only be output if a==b.
<% } %>
Không có giới hạn nhân tạo về định dạng mã hoặc, chọn phong cách phù hợp với bạn nhất:
<%
if (a == b)
{
%>
This will only be output if a==b.
<%
}
%>
Chỉ lưu ý rằng tất cả các phi các phần mã của mẫu sẽ xuất hiện khá nhiều, tức là các tab và các khối %>
sau cũng sẽ được xuất ra.
Có một giới hạn, tất cả mã bạn viết phải vừa với một cuộc gọi phương thức duy nhất.
Hãy để tôi giải thích.
Cách template engine hoạt động là nó tạo ra một file .cs và thức ăn nó vào biên dịch C#, nộp cs này roughyly trông như thế này:
using directives
namespace SomeNamespace
{
public class SomeClass
{
public string Render(object data)
{
... all your code goes here
}
}
}
Điều này có nghĩa rằng bạn không thể xác định các lớp học mới , các phương thức mới, trường cấp lớp, v.v.
Tuy nhiên, bạn có thể sử dụng các đại biểu ẩn danh để tạo các hàm nội bộ. Ví dụ, nếu bạn muốn có một cách thống nhất của ngày định dạng:
Func<DateTime, string> date2str = delegate(DateTime dt)
{
return dt.ToString("G");
};
sau đó bạn chỉ có thể sử dụng trong phần còn lại của mẫu mã:
<%= date2str(DateTime.Now) %>
Chỉ yêu cầu tôi phải là bạn don' t tải các tệp lên web và yêu cầu bạn đã viết mã, ngoài việc bạn tự do làm những gì bạn muốn với nó.
Chỉnh sửa 23.04.2011: Cố định liên kết đến dự án CodePlex.
Wooow O.o Tôi đang tải xuống ngay bây giờ và tôi sẽ cho bạn biết cách thức hoạt động. Nếu nó làm mọi thứ bạn nói, bạn sẽ là một người bảo vệ cuộc sống tuyệt đối! – Amberite
Đã chỉnh sửa câu trả lời ngay bây giờ, như bạn đã nói trong email, biến "Dữ liệu" không tồn tại, vì nó được đặt tên là "dữ liệu". Đó là một tham số phương thức, do đó chữ thường "d". –
"Cách mà công cụ tạo mẫu hoạt động là nó tạo ra tệp .cs và nạp nó vào trình biên dịch C#": Điều đó có nghĩa là máy chạy VisStudio này hay ít nhất một cái gì đó khác được cài đặt? Hoặc là có một cách mà chương trình của bạn gọi trình biên dịch C#? Tôi không nghĩ rằng trình biên dịch đã được vận chuyển với thời gian chạy .net ... Mặc dù kể từ khi IIS có thể biên dịch ASP.NET trên bay, tôi đoán nó phải được ra khỏi một nơi nào đó ... – CodingWithSpike