2010-01-08 52 views
3

一个人怎么可以创建一个对象,当它的运营商,如:PowerShell和被覆盖的对比运营商

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中似乎并没有兑现这些运营商
+0

你能提供更多关于你想要做什么的暗示吗?也许它可能是另一种方式。 – GrayWizardx 2010-01-08 19:17:19

+0

你是否希望在Powershell中严格执行此操作,或者创建一个.NET对象,该对象具有可在Powershell中使用的重写操作符? – 2010-01-08 19:23:44

+0

对不起,这是一个非常模糊的问题。我试图创建一个.NET对象,并在PowerShell中进行比较 – 2010-01-08 19:25:40

回答

1

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

+0

是的,我看到同样的事情。如果我可以使用重写的比较运算符:\ – 2010-01-08 22:20:11

+3

如果他试图“创建一个.NET对象”(大概是在C#或VB中),为什么他需要在PowerShell中重写运算符,因为它可以在C#中轻松完成或VB? – 2010-01-09 16:20:43

0

你不能在PowerShell中重载操作符,但我相信你声明它的方式会起作用,因为PowerShell应该服从.NET的操作符重载。当这不起作用时,你经常看到的是每边都有不同的对象,即一个[int] -gt [string]。在比较之前,您总是可以尝试明确地投射两个对象。

希望这有助于

12

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

您可以在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