gpt4 book ai didi

powershell - 你能实现一个动态创建的 PSObject 以便相等和比较工作吗?

转载 作者:行者123 更新时间:2023-12-03 00:55:11 24 4
gpt4 key购买 nike

我一直在通过向 PSObjects 动态添加方法来实现临时类型

我希望能够使用“-eq”、“-lt”和“-gt”运算符比较我的对象的两个实例(我假设这需要我实现 IComparible 和 IEquatible 等接口(interface))

这种事情可能吗? (我想也许不是因为这些事情通常发生在类型级别,而我的临时“类型”都是相同的类型)

如果没有,我还能做些什么(除了使用 c#)?

最佳答案

我认为您无法将接口(interface)附加到您正在创建的 psobject 上。但是,您可以在实现适当接口(interface)并覆盖适当方法的 C# 类中创建类型。您甚至可以在此处的字符串中定义此类型,并使用 Add-Type 对其进行编译并将其加载到 PowerShell 中。然后您只需创建该类型而不是 psobject。它应该具有您感兴趣的所有相关属性以及进行比较/相等的能力。

根据我的评论,这里是如何在你的脚本中执行此操作,并且在执行期间最小化头痛,即你只需要在更改 C# 代码时更改 typename 变量。

$foo = "Foo"

$src = @"
using System;
public class $foo : IComparable {
public string Name {get; set;}
public int Age {get; set;}
public int CompareTo(object obj)
{
$foo other = obj as $foo;
if (other == null)
throw new ArgumentException("arg must be type $foo or not null");
return Age.CompareTo(other.Age);
}

public override bool Equals(object obj)
{
if (obj == null) return false;
if (Object.ReferenceEquals(this, obj)) return true;

$foo other = obj as $foo;
if (other == null)
throw new ArgumentException("arg must be type $foo or not null");
return Age.Equals(other.Age) && Name.Equals(other.Name);
}

public override int GetHashCode()
{
return Age.GetHashCode() ^ Name.GetHashCode();
}

public override string ToString()
{
return String.Format("Name: {0}, age: {1}", Name, Age);
}
}
"@

if (![Type]::GetType($foo))
{
Add-Type -TypeDefinition $src -Language CSharpVersion3
}

$foo1 = New-Object $foo
$foo1.Age = 47
$foo1.Name = 'Keith'
$foo1


$foo2 = New-Object $foo
$foo2.Age = 45
$foo2.Name = 'John'
$foo2

$foo2 -gt $foo1

关于powershell - 你能实现一个动态创建的 PSObject 以便相等和比较工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3577251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com