2013-03-06 13 views
1

初始化自定義對象名單我已經在C#.NET 3.5下面的代碼 - VS2010,用於初始化自定義對象名單在PowerShell中

我需要一個PowerShell腳本2.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; 
} 

回答

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#(或VB中使用參數-CodeDomProvider覆蓋C#默認值)動態編譯源代碼到臨時程序集並加載該程序集,則需要執行大量工作(使用您自己的CodeDOM類型)。 Add-Type非常容易。

這將有助於知道爲什麼你想避免Add-Type

2

我知道OP有PS v2的限制。但是,即使我們在v3中搜索如何執行此操作,Google也會引導我們回答這個問題。我將添加此答案以幫助其他可能正在查找此信息的v3用戶。

Object Initializers便利可以在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],我們創建一個OrderedDictionary而不是 HashTable。這僅適用於文字 - 如果您在 變量上嘗試,則排序不再可用。

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

以類似的方式,你可以用一個簡單的鑄件創建自定義對象:

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

這不會創建一個哈希表;它會創建一個具有註釋 屬性的PSObject。如果您正在投射文字,則筆記屬性將按其在文字中出現的順序添加 。如果您要投入 其他任何內容,則排序由IDictionary迭代器確定。

如果一個類型都有一個默認的構造函數和可設置的屬性,你可以 也使用哈希表來區分的目的是該類型:

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

這將調用默認的構造函數,並設置屬性命名爲 的哈希表。