1

カスタムオブジェクトリストを初期化するために、C#.NET3.5-VS2010に次のコードがあります

Powershell2.0スクリプトでも同じことを行う必要があります。

Add-Typeを使用せずに、それについて何か提案はありますか?

public static List<ReplaceForDeployFile> CreateReplaceList()
{
    var list = new List<ReplaceForDeployFile>()
    {
        new ReplaceForDeployFile()
        { 
            PathFile = "web.config",
            ReplaceList = 
                new List<ItemReplaceForDeployFile>()
                {
                    new ItemReplaceForDeployFile()
                    {
                        ReplaceType = "System.String", 
                        ValueSource = @"value=""Value1""", 
                        ValueForDES = @"value=""Value2""",
                    },
                    new ItemReplaceForDeployFile()
                    {
                        ReplaceType = "System.String", 
                        ValueSource = @"customErrors mode=""On""", 
                        ValueForDES = @"customErrors mode=""Off""",
                    },
               },
          },            
    };
    return list;
}
4

2 に答える 2

3

OPにPS v2の制限があることは承知しています。ただし、v3でこれを行う方法を検索しても、Googleはこの質問に導きます。この情報を探している可能性のある他の v3 ユーザーを支援するために、この回答を追加しています。

オブジェクト初期化子の利便性は、次の構文を使用して PowerShell で実現できます。

$item = [FullyQualifiedClassName]@{Prop1='Value1'; Prop2='Value2'}

OPの例

var item = new ItemReplaceForDeployFile() { ReplaceType = "System.String", ValueSource = @"value=""Value1""", ValueForDES = @"value=""Value2""" };

になる

$item = [Namespace.SubNs.ItemReplaceForDeployFile]@{ReplaceType='System.String'; ValueSource='value="Value1"'; ValueForDES='value="Value2"'}

ソース: http://blogs.msdn.com/b/powershell/archive/2012/06/14/new-v3-language-features.aspx

新しいコンバージョン

ハッシュ リテラルのキーを順序付けしたい場合があります。[ordered] にキャストできるようになり、HashTable の代わりに OrderedDictionary を作成します。これはリテラルでのみ機能します。変数で試すと、順序付けができなくなります。

[ordered]@{a=1; b=2}

同様の方法で、単純なキャストでカスタム オブジェクトを作成できます。

[pscustomobject]@{x=1; y=2}

これは HashTable を作成しません。メモのプロパティを持つ PSObject を作成します。リテラルをキャストする場合、ノート プロパティはリテラルに表示される順序で追加されます。他のものをキャストする場合、順序は IDictionary イテレーターによって決定されます。

型にデフォルトのコンストラクターと設定可能なプロパティがある場合、ハッシュ テーブルを使用してオブジェクトをその型に分類することもできます。

[System.Drawing.Point]@{X=1; Y=2}

これにより、デフォルトのコンストラクターが呼び出され、ハッシュ テーブルで指定されたプロパティが設定されます。

于 2013-10-07T20:25:28.923 に答える
2

あなたの質問に対する答えは、タイプItemReplaceForDeployFileが定義されている方法と場所によって異なります。ロードされ、デフォルトのコンストラクターしかない場合は、プロパティを個別に割り当てる必要があります。

$x = new-object CorrectNamespace.ItemReplaceForDeployFile;
$x.ReplaceType = 'System.String';
$x.ValueSource = 'customErrors mode="On"', 
$x.ValueForDES = 'customErrors mode="Off"',

またはをAdd-Type使用せずにアセンブリをロードします。[Assembly]::LoadFrom($path)[Assembly]::LoadWithPartialName($name)

だが

Add-Type -AssemblyName name

はるかに簡単で明確です。

ただし、PowerShellでソースをC#で動的にコンパイル(または-CodeDomProviderパラメーターを使用してC#のデフォルトをオーバーライドするVB)して一時的なアセンブリにコンパイルし、そのアセンブリを読み込む場合は、多くの作業を行う必要があります(該当するCodeDOMタイプを自分で操作する) )。Add-Type非常に簡単です。

なぜ避けたいのかを知るのに役立ちますAdd-Type

于 2013-03-06T11:40:24.420 に答える