我有一个.NET类,我想从C#和PowerShell中使用它。减少它的骨头,它是这样的:
class Record
{
Dictionary<string, string> _fields = new Dictionary<string, string>();
public IDictionary<string, string> Fields { get { return _fields; } }
//...other stuff...
}
所以我从某个地方得到一个记录,我可以做record.Fields [“foo”] =“bar”修改/添加C#或PowerShell中的字段。效果很好。
但是我想让PowerShell更加友好。我想做record.foo =“bar”并让它调用适当的getter和setter。 (我想在某些时候用C#做同样的事情,可能使用动态,但这是一个独立的有趣项目)。好像我需要一个包装代理类。
我知道add-member但是我担心它会很慢并且在处理成千上万条记录时会占用大量内存。我也不知道如何处理record.somenewvalue =“abc”。
我猜我想在C#中创建我的代理类,使用System.Management.Automation或Microsoft.PowerShell中的工具,但不知道从哪里开始。任何人都可以帮助我指出正确的方向吗?
答案 0 :(得分:2)
我想出了一种方法。只需将Record本身设为字典。这是一些示例代码:
$source = @"
using System.Collections.Generic;
public class Record : Dictionary<string, object>
{
}
"@
add-type -typedefinition $source
$x = new-object record
$x.add('abc', '1') # add
$x['def'] = '2' # indexer
$x.ghi = 3 # "member"
$x
输出:
Key Value
--- -----
abc 1
def 2
ghi 3
答案 1 :(得分:0)
以下是一些说明三个建议的代码:
public class Record: IEnumerable<KeyValuePair<string, string>>
{
public Record() {}
public Record (Hashtable ht)
{
foreach (var key in ht.Keys)
{
this[key.ToString()] = ht[key].ToString();
}
}
Dictionary<string, string> _fields = new Dictionary<string, string>();
public IDictionary<string, string> Fields { get { return _fields; } }
public string this[string fieldName] {
get {
return _fields[fieldName];
}
set { _fields[fieldName] = value; }
}
//...other stuff...
public IEnumerator<KeyValuePair<string, string>> GetEnumerator()
{
return _fields.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
现在这里有一些说明改进用法的PowerShell:
Add-Type -Path 'C:\Users\zippy\Documents\Visual Studio 2010\Projects\ConsoleApplication1\ClassLibrary1\bin\Debug\ClassLibrary1.dll'
[ClassLibrary1.Record] $foo = New-Object ClassLibrary1.Record;
$foo["bar"]
$foo["bar"] = "value";
$foo["bar"]
[ClassLibrary1.Record] $foo2 = @{
"bar"= "value";
"something"= "to talk about";
};
$foo2;