在Powershell中初始化自定义对象列表

时间:2013-03-06 07:29:28

标签: c# powershell collections initialization

我在C#.NET 3.5 - VS2010中有以下代码,用于初始化自定义对象列表

我需要在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 个答案:

答案 0 :(得分: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)加载程序集而不使用Add-Type -AssemblyName name

但是

-CodeDomProvider

更容易,更清晰。

但是,如果您希望PowerShell将C#中的源代码(或使用Add-Type参数的VB覆盖C#默认值)动态编译为临时程序集并加载该程序集,则需要执行大量工作(自己使用适用的CodeDOM类型)。 Add-Type非常容易。

了解您为什么要避免{{1}}。

会有所帮助

答案 1 :(得分:2)

我知道OP有PS v2的限制。然而,即使我们在v3中搜索如何执行此操作,Google也会引导我们回答这个问题。我正在添加此答案,以帮助可能正在寻找此信息的其他v3用户。

使用以下语法

可以在PowerShell中实现Object Initializers的便利性

$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而不是   哈希表。这仅适用于文字 - 如果您在文字上尝试   变量,订单不再可用。

     

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

     

以类似的方式,您可以使用简单的强制转换创建自定义对象:

     

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

     

这不会创建HashTable;它创建一个带注释的PSObject   属性。如果要转换文字,则注释属性为   按照它们出现在文字中的顺序添加。如果你正在铸造   其他任何东西,排序由IDictionary迭代器确定。

     

如果类型具有默认构造函数和可设置属性,则可以   还使用哈希表将对象置于该类型:

     

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

     

这将调用默认构造函数并设置名为的属性   哈希表。