1

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

我也需要在 Powershell 2.0 脚本中做同样的事情。

关于它的任何建议,不使用添加类型?

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 中搜索如何做到这一点,谷歌也会将我们引向这个问题。我正在添加此答案以帮助可能正在寻找此信息的其他 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],我们创建一个 OrderedDictionary 而不是 HashTable。这仅适用于文字 - 如果您在变量上尝试它,则排序不再可用。

[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# 中的源代码(或使用参数覆盖 C# 默认值的 VB)动态编译-CodeDomProvider到临时程序集中并加载该程序集,您需要做很多工作(自己使用适用的 CodeDOM 类型)。Add-Type容易得多。

这将有助于了解您为什么要避免Add-Type

于 2013-03-06T11:40:24.420 回答