0

カスタム足場を作成するために T4Scaffolding を使用しています。次の PS コードを使用して、プロジェクト内のすべてのドメイン オブジェクトのリストを取得します。

# 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 変数をシリアル化できないことです。私は何を間違っていますか?

4

1 に答える 1

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 配列を通常のパラメーター (4 番目のパラメーター) として渡すだけです...

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;}
<#  
}
#>

私がやりたいことではありません...しかし、うまくいきます

于 2013-08-25T18:17:57.627 に答える