如何在其运算符时创建一个对象,例如:
operator > (Object obj1, Object obj2)
operator < (Object obj1, Object obj2)
,是否被覆盖PowerShell使用这些运算符?
这样:
where-object { $CustomObject -gt 12 }
会打电话:
public static bool operator > (Object object1, Object object2)
有可能吗?
澄清:
答案 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]。在比较之前,您总是可以尝试明确地投射两个对象。
希望这有帮助