我尝试了一个天真的实现,但我得到的只是枚举扩展假装的Key,Value字典。
扩大问题。
get-datarows cmdlet应该向下推送管道(它接受任意查询)。我不知道要实例化和推送什么对象类型。 db查询可以返回User = dave,Age = 12的行,然后是User = pete,Favcol = red的另一行。下次运行cmdlet时,查询可能会返回完全不同的内容(Type = shoe,color = red,use = dancing)。能够实例化expandos管道在这里完美地工作(除了它没有)
我最好的目的是使用reflection.emit动态生成一个类型,但这需要我知道对象的模式。我可以通过查看db查询返回的第一个对象来完成它,但可能没有所有可能的属性(如上面的前2个用户行)。我可以一直读到最后;制作动态创建类型的类型,倒带和推送实例,但效率不高
EDIT2:更加澄清
我在c#编码
我希望能够做到
mycmdlet -query "users" | ft
或
mycmdlet -query "products;type=shoe,size>1" | make-pretty
我不希望用户必须进行一大堆数据整形;这就是cmdlet的全部目的
答案 0 :(得分:1)
我明白了。 powershell有自己的扩展; psobject。这是WriteObject推动的行为。但你可以自己制作
所以
var obj = new PSObject();
obj.properties.add(new PSNoteProperty("foo", 42));
obj.properties.add(new PSNoteProperty("bar", "xxxx"));
WriteObject(obj);
答案 1 :(得分:0)
没有任何理由不能在管道中拥有具有不同属性集的对象。它应该工作正常。我一直这样做。
你能更具体地说明什么不起作用吗?也许是你想要做的一个例子?
答案 2 :(得分:0)
我要么误解你的问题,要么就是我一直这么做。我的代码全部正常运行,但是在psuedo中 -
$results = Get-ResultSet...
$columns = @{}
foreach ($column in $results.Columns)
{
columns.Add($column.Name,$column.Index)
}
foreach ($row in results)
{
$return = New-Object PSObject
foreach ($key in $columns.keys)
{
$return | Add-Member -MemberType NoteProperty -name $key $row[$columns[$key]]
}
$return
}
您的自定义对象将具有与列一样多的属性,并且每个属性都将具有您想要的值。