2016-11-22 60 views
0

我已經創建了這個問題,解釋了我作爲參考的步驟,因爲我的搜索花了很長時間不知道在哪裏以及如何找到此解決方案。如何使用envDTE命名空間在T4中獲取基類的屬性?

我在我的業務邏輯項目中創建了一個T4模板,用於根據現有的類和其他項目(相同的解決方案)創建一些類,作爲放置我的T4模板的位置。我已經從有形的模板庫中加載了VisualStudioHelper包含。這對從我的實體項目中獲取實體類很有幫助。

Project targetProject= VisualStudioHelper.GetProject("ProjectName"); 

從那裏我得到了我的課:

var allClasses = VisualStudioHelper.CodeModel.GetAllCodeElementsOfType(targetProject.CodeModel.CodeElements, EnvDTE.vsCMElement.vsCMElementClass, false); 

CodeClass targetClass= allClasses 
     .Cast<CodeClass>() 
     .Where(p => p.Name == "ClassName") 
     .Single(); 

現在我有我的課,我可以查詢我的屬性:

var allProperties = VisualStudioHelper.CodeModel.GetAllCodeElementsOfType(targetClass.Members, EnvDTE.vsCMElement.vsCMElementProperty, true); 

我發現了(顯然)是的性質基類沒有註冊爲目標CodeClass元素的屬性。

有人可以幫我查詢我的T4模板的基類屬性。

正如所解釋的那樣,T4在我的業務邏輯層(BLL)中,因爲我使用了EF-CodeFirst,因此我的實體在BLL中與我的DAL中完全相同,因此被定位的實體類位於通用實體項目中。基礎類來自我編寫自己的Common Library項目(Nuget),其中包含使用EF-CodeFirst時使用的每個實體的屬性。

Software Layering

希望有人能幫助我。

親切的問候, Luuk Krijnen

回答

0

我看你們還VisualStudioHelper,你可能需要添加一個方法喜歡GetAllMethods在裏面。

這裏是我的代碼:

public IEnumerable<EnvDTE.CodeProperty> GetAllProperties(EnvDTE.CodeClass codeClass) 
{ 
    var props = new List<EnvDTE.CodeProperty>(); 

    props.AddRange(GetProperties(codeClass)); 
    var baseClass = GetBaseClass(codeClass); 
    if (baseClass != null) 
     props.AddRange(GetAllProperties(baseClass)); 

    return props.Distinct(new CodePropertyEqualityComparer()); 
} 

public IEnumerable<EnvDTE.CodeProperty> GetProperties(EnvDTE.CodeClass codeClass) 
{ 
    return GetAllCodeElementsOfType(codeClass.Members, EnvDTE.vsCMElement.vsCMElementProperty, true).OfType<EnvDTE.CodeProperty>(); 
} 
相關問題