2016-11-22 5 views
0

이 솔루션을 찾을 수있는 위치와 방법을 알지 못해 오랜 시간이 걸렸으므로 참조로 취한 단계를 설명하는이 질문을 만들었습니다.envDTE 네임 스페이스를 사용하여 T4에서베이스 클래스의 속성을 얻는 방법?

내 비즈니스 논리 프로젝트에서 기존 클래스를 기반으로 일부 클래스를 만들고 T4 템플릿이있는 다른 프로젝트 (동일한 솔루션)를 만들기 위해 T4 템플릿을 만듭니다. Visual StudioHelper 포함 템플릿 갤러리에서 VisualStudioHelper를 이미로드했습니다. 이것은 Entity-Project에서 엔티티 클래스를 가져 오는 데 많은 도움이되었습니다. 의 특성을 나는 (분명히) 발견

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

것을 : 내 속성을 조회 할 수있는 내 클래스가 이제

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

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

: 거기에서

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

나는 내 수업을 얻었다 baseclass는 대상 CodeClass 요소의 속성으로 등록되지 않습니다.

누군가 내 T4 템플릿의 기본 클래스 속성을 쿼리하도록 도와 줄 수 있습니까?

설명한대로 T4는 비즈니스 로직 계층 (BLL)에 있습니다. 대상이 정확히 내 BLL에서 내 DAL과 동일한 EF-CodeFirst를 사용했기 때문에 대상이되는 엔티티 클래스는 일반적인 Entity 프로젝트에 있습니다. . 기본 클래스는 EF-CodeFirst를 사용할 때 사용하는 모든 단일 엔터티에 대한 속성을 포함하여 직접 작성한 공용 라이브러리 프로젝트 (Nuget)에서 가져옵니다.

Software Layering

희망 누군가가 나에게 도움이 될 수 있습니다.

친절 감사, 루크 Krijnen 난 당신이 VisualStudioHelper있어 참조

답변

0

, 당신은 방법이 그것에서 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>(); 
} 
: 여기

내 코드입니다