2014-03-29 2 views
0

Я занят созданием сборки, которая будет собирать информацию CodeModel, которая, в свою очередь, используется для генерации кода с помощью шаблона T4.CodeProperty CodeType внезапно пропал

Я борюсь с CodeModel из-за отсутствия хорошей информации. Я нашел несколько книг, описывающих CodeModel, но только истинные основы. Не найдено углубленной документации.

На прошлой неделе я создал указанную сборку, и следующая конструкция работала нормально более 4 дней.

/// <summary> 
    /// The CodeType of the property 
    /// </summary> 
    public CodeType CodeType 
    { 
     get 
     { 
      if (!m_CodeTypeInitialized) 
      { 
       CodeTypeRef codeTypeRef = CodeProperty.Type; 
       m_CodeType = codeTypeRef.CodeType; 

       m_CodeTypeInitialized = true; 
      } 

      return m_CodeType; 
     } 
    } 

Вчера эта конструкция больше не возвращает CodeType. Теперь я изменил код на

/// <summary> 
    /// The CodeType of the property 
    /// </summary> 
    public CodeType CodeType 
    { 
     get 
     { 
      if (!m_CodeTypeInitialized) 
      { 
       if (CodeProperty.IsCodeType) 
       { 
        CodeTypeRef codeTypeRef = CodeProperty.Type; 
        m_CodeType = codeTypeRef.CodeType; 
       } 

       m_CodeTypeInitialized = true; 
      } 

      return m_CodeType; 
     } 
    } 

Это больше не вызывает исключение, но результат всегда равен «null». Я потерялся. Что может привести к тому, что CodeProperty внезапно потеряет CodeType?

Мне действительно нужен CodeType, потому что много кода привязано к его информации.

ответ

0

Я смог создать такую ​​работу, как это. Это не приятно, но все нормально: это хорошо:

 private FileCodeModel m_FileCodeModel; 

    /// <summary> 
    /// The FileCodeModel the entity of this property is found in. 
    /// </summary> 
    public FileCodeModel FileCodeModel 
    { 
     get 
     { 
      if (m_FileCodeModel == null) 
      { 
       m_FileCodeModel = EntityMetadata.FileCodeModel; 
      } 

      return m_FileCodeModel; 
     } 
    } 

    private Project m_Project; 

    /// <summary> 
    /// The project this properties entity is contained in. 
    /// </summary> 
    public Project ContainingProject 
    { 
     get 
     { 
      if (m_Project == null) 
      { 
       m_Project = FileCodeModel.Parent.ContainingProject; 
      } 

      return m_Project; 
     } 
    } 

    private CodeModel m_CodeModel; 

    /// <summary> 
    /// The CodeModel for the properties entity. 
    /// </summary> 
    public CodeModel CodeModel 
    { 
     get 
     { 
      if (m_CodeModel == null) 
      { 
       m_CodeModel = ContainingProject.CodeModel; 
      } 

      return m_CodeModel; 
     } 
    } 

    /// <summary> 
    /// De CodeType van de property 
    /// </summary> 
    public CodeType CodeType 
    { 
     get 
     { 
      if (!m_CodeTypeInitialized) 
      { 
       if (CodeProperty.IsCodeType) 
       { 
        CodeTypeRef codeTypeRef = CodeProperty.Type; 
        m_CodeType = codeTypeRef.CodeType; 
       } 
       else 
       { 
        m_CodeType = CodeModel.CodeTypeFromFullName(CodeProperty.Type.AsFullName); 
       } 

       m_CodeTypeInitialized = true; 
      } 

      return m_CodeType; 
     } 
    } 
+0

Я только понял, что это работает только в том случае, если тип, который я ищу, содержится в том же проекте. А также на самом деле не отвечает на вопрос :-( –