2014-09-27 8 views
0

Я пробовал это на 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 
+0

Эти поля не являются свойствами, что делает большую разницу. Если они являются свойствами, эквивалентный код C# даже не компилируется. –

+0

Вы имеете в виду мое слово «Свойство»? Я украл его из вывода MemberType командлета Get-Member. Несмотря на то, что само слово произвольно, я извиняюсь за любую путаницу. Вы правы, они действительно поля. Несмотря на это, похоже, что PowerShell не обрабатывает структуры так же, как это делает C#. – Hossy

ответ