2012-04-29 18 views
5

से एक्सेस होस्ट ऑब्जेक्ट जब मैं < # + #> ब्रैकेट में घोषित गैर-स्थैतिक विधि से होस्ट ऑब्जेक्ट तक पहुंचने का प्रयास करता हूं, तो सबकुछ ठीक काम करता है। लेकिन मैं, एक वर्ग विधि से उस तक पहुंच इस तरह की जरूरत है:टी 4 कक्षा

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

मैं निम्न त्रुटि हो जब इस टेम्पलेट कार्यान्वित: "संकलन परिवर्तन: 'बाहरी प्रकार का एक गैर स्थिर सदस्य तक नहीं पहुंच पा Microsoft.VisualStudio .TextTemplating7D03DF372FEAC3D3A28C011A41F02403.GeneratedTextTransformation Microsoft.VisualStudio.TextTemplating7D03DF372FEAC3D3A28C011A41F02403.GeneratedTextTransformation.ProjectTraverser 'प' नेस्टेड प्रकार के माध्यम से ': \ परियोजनाओं \ टेस्ट समाधान \ GettingStarted \ TelerikMvc3RazorApplication \ TextTemplate2.tt "

किसी भी विचारों को साझा करें।

+1

यह बिल्कुल जैसे कि यह कहते हैं (बाहरी प्रकार के गैर स्थिर सदस्य तक नहीं पहुँच सकता है), लेकिन आप ProjectTraverser के एक निर्माता में होस्ट गुजारें सकता है:

यहाँ एक किसी न किसी उदाहरण है। – FuleSnabel

+0

आपकी टिप्पणी FuleSnabel के लिए धन्यवाद। Encapsulation का सबसे अच्छा स्तर नहीं है, लेकिन फिर भी यह एक समाधान है। – Narek

उत्तर

4

जैसा कि फुलेस्नाबेल ने टिप्पणी की थी, आप जो घोषणा कर रहे हैं वह एक नेस्टेड प्रकार के लिए है, जिसमें टेम्पलेट का प्रतिनिधित्व करने वाले संलग्न प्रकार में आवृत्ति चर तक पहुंच नहीं है।

आप क्या करना चाहते हैं, ProjectTraverser क्लास (संभवतः स्थैतिक) में ITextTemplatingEngineHost प्रकार की मेजबान संपत्ति जोड़ें और फिर इसे मुख्य टेम्पलेट से सेट करें।

पीछे की ओर, मैं चाहता हूं कि मैं मुख्य होस्ट संपत्ति स्थिर कर दूंगा, क्योंकि एक ही ऐपडोमेन में एक ही टेम्पलेट के विभिन्न उदाहरणों के लिए एकाधिक होस्टों की कल्पना करना वास्तव में समझदार नहीं है, लेकिन आप रहते हैं और सीखते हैं।

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

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

आपके उत्तर गैरेथ के लिए धन्यवाद, क्या आप कृपया "और फिर इसे मुख्य टेम्पलेट से सेट करें" पर विस्तारित कर सकते हैं। जहां तक ​​मैं समझता हूं, मेरे पास मेरी कक्षा के लिए एक अलग प्रारंभिक विधि होनी चाहिए, जिसे कक्षा का उपयोग करने से पहले बुलाया जाना चाहिए, जो कि असुविधाजनक है। क्या मैं सही हूं, या इसे बेहतर तरीके से हासिल किया जा सकता है? – Narek

+0

एक छोटा सा उदाहरण शामिल करने के लिए संपादित किया गया। – GarethJ

संबंधित मुद्दे