2012-04-29 45 views
5

Khi tôi cố gắng truy cập đối tượng Host từ phương thức không tĩnh được khai báo trong < # + #> dấu ngoặc, mọi thứ hoạt động ok. Nhưng tôi cần phải truy cập nó từ một phương pháp học, như thế này:Đối tượng lưu trữ truy cập từ lớp T4

<#+ 
public class ProjectTraverser 
{ 
    public void Traverse() 
    { 
     var a = Host; 
    } 
} 
#> 

tôi nhận được lỗi sau khi mẫu này thực hiện: "chuyển đổi Biên soạn: Không thể truy cập vào một thành viên không tĩnh của loại ngoài 'Microsoft.VisualStudio .TextTemplating7D03DF372FEAC3D3A28C011A41F02403.GeneratedTextTransformation' qua kiểu lồng nhau 'Microsoft.VisualStudio.TextTemplating7D03DF372FEAC3D3A28C011A41F02403.GeneratedTextTransformation.ProjectTraverser' d: \ Projects \ Test Solutions \ GettingStarted \ TelerikMvc3RazorApplication \ TextTemplate2.tt"

Hãy chia sẻ bất kỳ ý tưởng.

+1

Đó là chính xác như nó nói (không thể truy cập thành viên không tĩnh của loại bên ngoài) nhưng bạn có thể vượt qua máy chủ trong một constructor để ProjectTraverser. – FuleSnabel

+0

Cảm ơn bạn đã bình luận của bạn FuleSnabel. Không phải là mức đóng gói tốt nhất, nhưng nó vẫn là một giải pháp. – Narek

Trả lời

4

Khi FuleSnabel nhận xét, khai báo bạn đang tạo là kiểu lồng nhau, không có quyền truy cập vào biến mẫu trong kiểu bao quanh đại diện cho mẫu.

Điều bạn sẽ muốn làm là thêm thuộc tính Máy chủ lưu trữ loại ITextTemplatingEngineHost vào lớp ProjectTraverser (có thể là tĩnh) và sau đó đặt nó từ mẫu chính. Để xem lại, tôi muốn tôi tạo thuộc tính Host chính tĩnh, vì nó không thực sự hợp lý để tưởng tượng nhiều máy chủ cho các trường hợp khác nhau của cùng một khuôn mẫu trong cùng một AppDomain, nhưng bạn sống và học hỏi.

Dưới đây là một ví dụ thô:

<#@ template hostspecific="true' #> 
<# 
    ProjectTraverser.Host = Host; 
#> 
<#+ 
public class ProjectTraverser 
{ 
    public static ITextTemplatingEngineHost Host { get; set; } 

    public void Traverse() 
    { 
     var a = Host; 
    } 
} 
#> 
+0

Cảm ơn câu trả lời của bạn Gareth, bạn có thể vui lòng xây dựng trên "và sau đó đặt nó từ mẫu chính" một phần. Theo như tôi hiểu, tôi phải có một phương pháp khởi tạo riêng cho lớp của tôi, nên được gọi trước khi sử dụng lớp, điều này khá bất tiện. Tôi có đúng hay điều này có thể đạt được một cách tốt hơn? – Narek

+0

Đã chỉnh sửa để bao gồm một ví dụ nhỏ. – GarethJ

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