如何使PowerShell的.NET对象更友好?

时间:2011-03-03 19:26:00

标签: powershell powershell-v2.0

我有一个.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中的工具,但不知道从哪里开始。任何人都可以帮助我指出正确的方向吗?

2 个答案:

答案 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();
    }
}
  1. 实施此索引器
  2. 实施IEnumerable&gt;改进powershell打印输出的方式
  3. 使用单个哈希表作为参数的构造函数允许您在初始赋值时使用@ {}表示法。
  4. 现在这里有一些说明改进用法的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;