我在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;
}
答案 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}
这将调用默认构造函数并设置名为的属性 哈希表。