2013-08-06 2 views
0

Я использую T4Scaffolding для создания пользовательского леса. Я использую следующий код PS, чтобы получить список всех объектов домена в моем проекте:T4 Ошибка сериализации массива PowerShell

# List of all domain classes. Get all top level files/folders in the project | drill down to Models folder | Enumerate ProjectItems | Where Name ends with .cs | Select name truncating .cs, pluralized name 
$domainClasses = (Get-Project "Domain").ProjectItems | Where { $_.Name -eq "Models" } | ForEach { $_.ProjectItems } | Where { $_.Name.EndsWith('.cs') } | Select @{ Name = 'Name'; Expression={ $_.Name.SubString(0,$_.Name.Length - 3) } }, @{ Name = 'Plural'; Expression={ Get-PluralizedWord $_.Name.SubString(0,$_.Name.Length - 3) } } 
if (!$domainClasses) { $domainClasses = @() } 

Тогда я вызываю метод Add-ProjectItemViaTemplate так:

Add-ProjectItemViaTemplate $outputPath -Template MyTemplate ` 
    -Model @{ DomainClasses=[Array]$domainClasses } ` 
    -SuccessMessage "Added Domain output at {0}" ` 
    -TemplateFolders $TemplateFolders -Project $DomainProjectName -CodeLanguage $CodeLanguage -Force:$Force 

Я получаю следующее исключение, когда я запустить sacffold:

System.Runtime.Serialization.SerializationException: Type 'System.Management.Automation.PSCustomObject' in assembly 'System.Management.Automation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' is not marked as serializable.  

проблема, кажется, что переменная $ domainClasses не может быть сериализовать по какой-то причине. Что я делаю не так?

ответ

0

Я попытался это давным-давно, но он не работает :(

Я решил это в любом случае, так как я заметил, что вы можете передать массив строку в T4-шаблон. Так как вы можете передать в массив строк, я построил разделенных запятыми строк с информацией для каждого объекта ... Тогда я сделал раскол («») внутри T4-шаблона, получить данные обратно ...

Пример

#Get regular properties 
$properties = @()(Get-ProjectType $ModelType).Children | Where-Object{$_.Kind -eq 4 -and $_.Type.TypeKind -ne 1 } | ForEach{ 
$p = "$($_.Name),$($_.Type.AsString)"; 
$properties = $properties + $p 
} 

Затем я просто передаю массив $ properties как обычный параметр (четвертый параметр) ...

Add-ProjectItemViaTemplate $outputPath -Template ViewModel ` 
-Model @{ 
Namespace = $namespace; 
DataType = [MarshalByRefObject]$foundModelType; 
DataTypeName = $foundModelType.Name; 
Properties = $properties; 
Parents = $parents; 
Children = $children; 
ExtraUsings = $ximports 
} ` 
-SuccessMessage "Added ViewModel for $ModelType {0}" ` 
-TemplateFolders $TemplateFolders -Project $coreProjectName -CodeLanguage $CodeLanguage -Force:$Force 

в Т4 я просто ...

<# 
//Own properties 
foreach (var property in Model.Properties) { 
    var info = property.Split(','); 
#> 
    public <#= info[1] #> <#= info[0] #> {get;set;} 
<# 
} 
#> 

Не то, что я предпочитаю делать ... Но это работает

Смежные вопросы