c# - 使用 op_Addition 创建自定义类

标签 c# class powershell-2.0

我正在阅读一本有关 WMI 和 Powershell 的书,它解释了如何在 Powershell 中创建自定义类。它涉及编写一些 C# 代码和 add-type 命令。当我尝试使用 += 命令在对象中创建多个条目时,出现以下错误:

Method invocation failed because [pawobject] doesn't contain a method named 'op_Addition'.
At line:23 char:14
+ $MyObjects += <<<<  $MyObject
    + CategoryInfo          : InvalidOperation: (op_Addition:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

我用来创建该类的代码是这样的:

$source = @"
public class pawobject
{
    public string Description { get; set; }
    public string Name { get; set; }
    public int Number { get; set;}
}
"@

为了将其添加到 PowerShell,我使用以下命令:

Add-Type $source -Language CSharpVersion3

创建值的代码是这样的:

$MyObject = New-Object -TypeName pawobject -Property @{
    Name = "MyObject5";
    Number = 200;
    Description = "Take3"
}

这将创建一个$MyObject。我的问题就是从这里来的。我尝试创建具有多个条目的对象,如下所示:

$MyObjects += $MyObject

但是我收到了上述错误。我已经尝试过了

$MyObjects = $MyObjects + $MyObject

我在网上查了一下,并尝试在公共(public)类中添加以下代码:

public static string Add(string a, string b) {
    return (a + b);
}

但这似乎只适用于数字。我对 C# 一点也不熟悉,所以我什至不知道从哪里开始修复这个错误。我可以看到这非常有用,因为我总是在我的环境中创建新对象。能够定义我们自己的类型将是一个巨大的优势,特别是能够控制可以放入每个属性的数据类型。预先感谢您,祝您有美好的一天!

编辑:让我解释一下我想要结果做什么。

我希望能够声明这样的内容:

$MyObject = New-Object -TypeName pawobject -Property @{
    Name = "MyObject";
    Number = 100;
    Description = "Take1"
    }

当我获取 $MyObject 的输出时,我最终得到以下结果:

Description   Name         Number
-----------   ----         ------
Take1         MyObject     100

我希望能够声明这一点:

$MyObjects += $MyObjects

最终 $MyObjects 具有以下内容:

Description   Name         Number
-----------   ----         ------
Take1         MyObject     100
Take2         MyObject5    200

基本上将 $MyObject 添加(不确定添加两组对象的技术术语)到 $MyObjects

最佳答案

它将其解释为将两个对象添加在一起 我认为在 C# 中你需要实现这样的操作:

    public static pawobject operator +(pawobject A, pawobject B)
    {

        //I have no idea how you would add two of these together
    }

我不确定这是否真的是您想要做的。看起来您想创建一个对象数组。

我已经对此进行了测试,它确实创建了一个对象数组。

PS C:\Users\James> $source = @"
>> public class pawobject3
>> {
>>     public string Description { get; set; }
>>     public string Name { get; set; }
>>     public int Number { get; set;}
>>     public static pawobject3[] operator +(pawobject3 A, pawobject3 B)
>>     {
>>         pawobject3[] Result = new pawobject3[2];
>>         Result[0] = A;
>>         Result[1] = B;
>>         return Result;
>>     }
>>     public static pawobject3[] operator +(pawobject3[] A, pawobject3 B)
>>     {
>>         pawobject3[] Result = new pawobject3[A.Length + 1];
>>         for(int i = 0; i < A.Length; i++)
>>             Result[i] = A[i];
>>         Result[A.Length] = B;
>>         return Result;
>>     }
>> }
>> "@
>>
PS C:\Users\James> Add-Type $source -Language CSharpVersion3
PS C:\Users\James> $MyPaw1
PS C:\Users\James> $MyPaw1 = New-Object -TypeName pawobject3 -Property @{
>> Name = "Test1";
>> Number = 1;
>> Description = "D1";
>> }
>>
PS C:\Users\James> $MyPaw2 = New-Object -TypeName pawobject3 -Property @{
>> Name = "Test2";
>> Number = 2;
>> Description = "D2";
>> }
>>
PS C:\Users\James> $MyPaw3 = New-Object -TypeName pawobject3 -Property @{
>> Name = "Test3";
>> Number = 3;
>> Description = "D3";
>> }
>>
PS C:\Users\James> $MyPaws = $MyPaw1 + $MyPaw2
PS C:\Users\James> $MyPaws += $MyPaw3
PS C:\Users\James> $MyPaws

Description                             Name                                                                     Number
-----------                             ----                                                                     ------
D1                                      Test1                                                                         1
D2                                      Test2                                                                         2
D3                                      Test3                                                                         3

您需要确保运算符(operator)知道其相加的内容。没有变量类型的声明,因此为了创建数组,我使用将 2 加在一起的返回类型。

希望这有帮助

关于c# - 使用 op_Addition 创建自定义类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12008144/

相关文章:

c# - 自定义控件覆盖的文本属性默认值

java - pH 值 - 不断返回相同的答案

jquery 将 == 更改为 contains?

c# - 如何使用 Add-Type 添加带有 System.Windows.Forms 命名空间的 C# 代码?

c# - 用 AssemblyLoadContext 替换 .NET AppDomain

c# - 如何以编程方式在 IIS 7 中获取站点列表和虚拟目录?

c# - lambda 中的新参数

c++ - 基于c++中的用户输入动态创建类的结构和变量

.net - .NET应用程序-提取程序集/文件版本令人困惑

PowerShell - 使用管道中的管道进行锯齿状数组过滤