Powershell和覆盖比较运算符

Ada*_*oll 4 .net powershell sdk

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

operator > (Object obj1, Object obj2)  
operator < (Object obj1, Object obj2)
Run Code Online (Sandbox Code Playgroud)

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

这样:

where-object { $CustomObject -gt 12 } 
Run Code Online (Sandbox Code Playgroud)

会打电话:

public static bool operator > (Object object1, Object object2)
Run Code Online (Sandbox Code Playgroud)

可能吗?

澄清:

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

Kei*_*ill 14

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
Run Code Online (Sandbox Code Playgroud)


Gra*_*rdx 0

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

  • 如果他尝试“创建 .NET 对象”(大概是在 C# 或 VB 中),为什么他需要在 PowerShell 中重写运算符,而这在 C# 或 VB 中可以轻松完成? (3认同)