2010-01-11 11 views
29

मैं एक वर्ग दृश्य स्टूडियो में TextTemplatingFileGenerator कस्टम उपकरण के साथ सेट अप के लिए एक टी -4 टेम्पलेट है:टी 4 टेम्पलेट्स में नेमस्पेस आउटपुट कैसे करें?

<#@ template language="C#v3.5" hostspecific="True" debug="True" #> 
<# 
    var className = System.IO.Path.GetFileNameWithoutExtension(Host.TemplateFile); 
    var namespaceName = "MyNamespace"; 
#> 

namespace <#= namespaceName #> 
{ 
    public static class <#= className #> 
    { 
     // some generated code 
    } 
} 

मैं दृश्य स्टूडियो में "कस्टम उपकरण नामस्थान" संपत्ति के मूल्य कैसे प्राप्त कर सकते हैं, तो मुझे नहीं पता नामस्थान हार्डकोड करना है?

मैं सी # प्रोजेक्ट के लिए डिफ़ॉल्ट नामस्थान से भी खुश हूं।

उत्तर

47

यदि आप विजुअल स्टूडियो 2010 का उपयोग कर रहे हैं, तो आप कॉलकॉन्टेक्स्ट की "नेमस्पेसहिंट" संपत्ति की जांच करके नामस्थान पुनर्प्राप्त कर सकते हैं।

System.Runtime.Remoting.Messaging.CallContext.LogicalGetData("NamespaceHint"); 
+1

दुर्भाग्यवश, यह चाल MSBuild- आधारित का उपयोग करते समय काम नहीं करती है परिवर्तन प्रणाली (जैसा कि यहां दिखाया गया है: http://www.olegsych.com/2010/04/understanding-t4-msbuild-integration/)। ओह। :( –

+0

यह फ़ंक्शन डिबगिंग विफल करता है –

8

डेमियन गार्ड एक ब्लॉग पोस्टिंग में कुछ कोड में शामिल हैं जो retrieves the Custom Tool Namespace for a given file:

<#@ template language="C#v3.5" hostspecific="True" debug="True" #> 
<#@ include file="T4Toolbox.tt" #> 
<# 
    var namespaceName = TransformationContext.DefaultNamespace; 
#> 

TransformationContext वर्ग के DefaultNamespace संपत्ति आधारित नाम स्थान के साथ एक स्ट्रिंग रिटर्न:

public override String GetCustomToolNamespace(string fileName) 
{ 
    return dte.Solution.FindProjectItem(fileName).Properties.Item("CustomToolNamespace").Value.ToString(); 
} 
13

यहाँ तुम क्या T4 Toolbox के साथ कर सकते है आपके प्रोजेक्ट के रूट नेमस्पेस और इसमें आपकी .tt फ़ाइल का स्थान (यानी यह फ़ोल्डर को नेमस्पेस के रूप में मानता है)। इस तरह आपको अपनी .tt फ़ाइल के प्रत्येक इंस्टेंस के लिए कस्टम टूल नेमस्पेस प्रॉपर्टी निर्दिष्ट करने की आवश्यकता नहीं है।

यदि आप कस्टम टूल नेमस्पेस प्रॉपर्टी का उपयोग करने के लिए पसंद करते हैं, तो आप @Sixlettervariables द्वारा पोस्ट की गई GetCustomToolNamespace विधि में Host.TemplateFile को पास कर सकते हैं।

+0

मैं त्रुटि मिलती है: 'T4Toolbox.TransformationContext' 'DefaultNamespace' –

+1

मिले के लिए एक परिभाषा शामिल नहीं है मैं से विधि का उपयोग करने के लिए किया था आपके इस पोस्ट में एक फिक्स: http://www.olegsych.com/2012/12/t4-toolbox-for-visual-studio-2012/ –

2

आप दृश्य स्टूडियो 2012

EdmItemCollection ItemCollection = loader.CreateEdmItemCollection(inputFile); 
string namespaceName = System.Runtime.Remoting.Messaging.CallContext.LogicalGetData("NamespaceHint").ToString(); 

EntityFrameworkTemplateFileManager fileManager = EntityFrameworkTemplateFileManager.Create(this); 

एल्डो फ्लोरेस @alduar

0

स्वीकार किए जाते हैं जवाब विजुअल बेसिक परियोजनाओं पर काम नहीं करता का उपयोग करते हैं। http://lennybacon.com/post/2010/12/10/generatingcodefileswithcorrectnamespacesusingt4

var hostServiceProvider = (IServiceProvider)Host; 
var dte = (EnvDTE.DTE)hostServiceProvider.GetService(typeof(EnvDTE.DTE)); 
var activeSolutionProjects = (Array)dte.ActiveSolutionProjects; 
var dteProject = (EnvDTE.Project)activeSolutionProjects.GetValue(0); 
var defaultNamespace = dteProject.Properties.Item("DefaultNamespace").Value; 
4

मैं कैसे किया है इस:

<#@ assembly name="EnvDTE" #> 
<#@ import namespace="EnvDTE" #> 

<# 
    // Get value of 'Custom Tool Namespace' 
    var serviceProvider = (IServiceProvider)this.Host; 
    var dte = (DTE)serviceProvider.GetService(typeof(DTE));  
    var Namespace = dte.Solution.FindProjectItem(this.Host.TemplateFile).Properties.Item("CustomToolNamespace").Value; 
#> 

namespace <#= Namespace #> { 

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