2013-08-06 23 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 

中T4我只是...

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

不是我喜歡做...但它的工作原理