Powershell и переопределенные операторы сравнения - PullRequest
4 голосов
/ 08 января 2010

Как можно создать объект, который когда его операторы, такие как:

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 ]

13 голосов
/ 08 января 2010

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
2 голосов
/ 12 июня 2015

Вы можете перегрузить оператор в 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
1 голос
/ 07 мая 2018

Чтобы сравнить два экземпляра пользовательского класса PowerShell с операторами -lt, -le, -ge и -gt, ваш класс должен реализовать интерфейс System.IComparable, и вы можете сделать это в обычный PowerShell (то есть вам не нужно использовать AddType):

Class MyClass : System.IComparable
{
    [int] $Value
    MyClass([int] $v)
    {
        $this.Value = $v
    }
    [int] CompareTo($that)
    {
        return $this.Value - $that.Value
    }
}

$instance1 = [MyClass]::new(1)
$instance2 = [MyClass]::new(2)

Write-Output ($instance1 -lt $instance2)
#Output: True
Write-Output ($instance1 -le $instance2)
#Output: True
Write-Output ($instance1 -ge $instance2)
#Output: False
Write-Output ($instance1 -gt $instance2)
#Output: False

Кстати, я столкнулся с проблемами при сравнении подклассов: см. PowerShell IC, сопоставимый с подклассами

0 голосов
/ 08 января 2010

Вы не можете выполнять перегрузку операторов в PowerShell, но я считаю, что способ, которым вы заявили, будет работать, поскольку PowerShell должен подчиняться перегрузке операторов .NET. Когда это не работает, вы часто видите разные объекты с каждой стороны, то есть a [int] -gt [string]. Вы всегда можете попробовать явное приведение обоих объектов перед сравнением.

Надеюсь, это поможет

0 голосов
/ 08 января 2010

Я не верю, что вы можете выполнять перегрузку операторов в Powershell.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...