Powershell和覆盖比较运算符

时间:2010-01-08 19:09:16

标签: .net powershell sdk

如何在其运算符时创建一个对象,例如:

operator > (Object obj1, Object obj2)  
operator < (Object obj1, Object obj2)

,是否被覆盖PowerShell使用这些运算符?

这样:

where-object { $CustomObject -gt 12 } 

会打电话:

public static bool operator > (Object object1, Object object2)

有可能吗?

澄清:

  • 该对象存在于.NET程序集
  • 该对象已覆盖比较运算符
  • PowerShell似乎不尊重这些运营商

5 个答案:

答案 0 :(得分:13)

PowerShell使用IComparable接口来比较对象。至少,这是以下小实验所显示的:

$src = @'
using System;
namespace Acme 
{
    public class Foo : IComparable
    {
        public Foo(int value)
        {
            this.Value = value;
        }

        public int Value { get; private set; }

        public static bool operator >(Foo foo1, Foo foo2)
        {
            Console.WriteLine("In operator >");
            return (foo1.Value > foo2.Value);
        }

        public static bool operator <(Foo foo1, Foo foo2)
        {
            Console.WriteLine("In operator <");
            return (foo1.Value < foo2.Value);
        }

        public int CompareTo(object obj)
        {
            Console.WriteLine("In CompareTo");
            if (obj == null) return 1;

            Foo foo2 = obj as Foo;
            if (foo2 == null) throw new ArgumentException("Not type Foo","obj");

            if (this.Value == foo2.Value)
            {
                return 0;
            }
            else if (this.Value > foo2.Value)
            {
                return 1;
            }
            else 
            {
                return -1;
            }
        }
    }
}
'@

Add-Type -TypeDefinition $src -Language CSharpVersion3

$foo1 = new-object Acme.Foo 4
$foo2 = new-object Acme.Foo 8

$foo1 -gt $foo2
In CompareTo
False

答案 1 :(得分:2)

您可以在C#

中重载运算符

如果在powershell中使用运算符,则将使用c#重载运算符

        // overloading + operator
        public static Nimber operator +(Nimber left, Nimber right)
    {
        var length = (left.List.Count > right.List.Count) ? left.List.Count : right.List.Count;
        var list = new int[length];

        for (int i = 0; i < left.List.Count; i++)
        {
            list[i] = left.List[i];
        }

        for (int i = 0; i < right.List.Count; i++)
        {
            list[i] += right.List[i];
        }

        return new Nimber(list);
    }

posershell使用

Add-Type -Path $TheAssemblyPath
$n1 = New-Object nim.nimber (1,2,4) 
$n2 = New-Object nim.nimber (10,20,40,50) 
"n1=$n1 and n2=$n2"

$n3 = $n1 + $n2
"n3=$n3"

,输出

n1=1, 2, 4 and n2=10, 20, 40, 50
n3=11, 22, 44, 50

答案 2 :(得分:1)

为了将自定义PowerShell类的两个实例与-lt-le-ge-gt运算符进行比较,您的类应该实现{{1}接口,你可以在一个普通的PowerShell中做到这一点(也就是说,你不需要使用System.IComparable):

AddType

BTW我在比较子类时遇到了问题:请参阅PowerShell IComparable with subclasses

答案 3 :(得分:0)

我不相信你可以在Powershell中进行操作符重载。

答案 4 :(得分:-1)

你不能在PowerShell中进行运算符重载,但我相信你声明它的方式将起作用,因为PowerShell应该遵守.NET的运算符重载。如果这不起作用,您经常看到的是每一侧的不同对象,即[int] -gt [string]。在比较之前,您总是可以尝试明确地投射两个对象。

希望这有帮助