Я пробовал это на PowerShell 3.0 и 4.0. У меня возникли проблемы с использованием структуры внутри класса. Я могу использовать свойства внутри структуры непосредственно из PowerShell без проблем. Я также могу использовать любые свойства стандартного типа внутри класса непосредственно из PowerShell без проблем. Однако, когда я совмещаю два (попробуйте использовать свойство пользовательского типа внутри класса), я не могу.Как использовать пользовательскую структуру в пользовательском классе в PowerShell?
Любая помощь была бы принята с благодарностью!
Вот краткий пример кода, чтобы воспроизвести то, что я вижу:
$MyTest = Add-Type @"
namespace MyTest
{
public struct Struct1
{
public string Property;
}
public class Class1
{
public struct Struct2
{
public string Property;
}
public string MyString;
public Struct1 Struct1Property;
public Struct2 Struct2Property;
}
}
"@ -PassThru
$struct1 = New-Object -TypeName MyTest.Struct1
$class1 = New-Object -TypeName MyTest.Class1
$struct1.Property = 'test'
$struct1.Property # Outputs: test
$class1.MyString = 'test'
$class1.MyString # Outputs: test
$class1.Struct1Property.Property = 'test'
$class1.Struct1Property.Property # Outputs: <nothing>
$class1.Struct2Property.Property = 'test'
$class1.Struct2Property.Property # Outputs: <nothing>
Я ожидаю, что оба $ class1.Struct1Property.Property и $ class1.Struct2Property.Property должен вывести «тест».
Если я скомпилировал тот же код, что и консольное приложение с VS2013, он работает нормально.
код консольного приложения:
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
MyTest.Struct1 struct1;
MyTest.Class1 class1 = new MyTest.Class1();
struct1.Property = "test";
Console.WriteLine("struct1.Property: {0}", struct1.Property);
class1.Struct1Property.Property = "test";
Console.WriteLine("class1.Struct1Property.Property: {0}", class1.Struct1Property.Property);
class1.Struct2Property.Property = "test";
Console.WriteLine("class1.Struct2Property.Property: {0}", class1.Struct2Property.Property);
}
}
}
namespace MyTest
{
public struct Struct1
{
public string Property;
}
public class Class1
{
public struct Struct2
{
public string Property;
}
public string MyString;
public Struct1 Struct1Property;
public Struct2 Struct2Property;
}
}
Выходные:
struct1.Property: test
class1.Struct1Property.Property: test
class1.Struct2Property.Property: test
Эти поля не являются свойствами, что делает большую разницу. Если они являются свойствами, эквивалентный код C# даже не компилируется. –
Вы имеете в виду мое слово «Свойство»? Я украл его из вывода MemberType командлета Get-Member. Несмотря на то, что само слово произвольно, я извиняюсь за любую путаницу. Вы правы, они действительно поля. Несмотря на это, похоже, что PowerShell не обрабатывает структуры так же, как это делает C#. – Hossy