2016-08-20 29 views
5

Tôi cần $this để làm việc bên trong lớp tĩnh! Làm thế nào để đạt được điều đó? Có cách giải quyết nào không? Tôi đã phân tích sự trở lại của Get-PSCallStack trong ngữ cảnh lớp học và không tìm thấy gì hữu ích.Cách lấy tên/đối tượng lớp hiện tại bên trong phương thức lớp tĩnh của PowerShell?

Tôi cần điều này để (a) ghi nhật ký và (b) gọi các phương thức tĩnh khác của cùng một lớp mà không nhắc đến tên của nó nhiều lần.

Mẫu mã (PowerShell v5):

class foo { 
    static [void]DoSomething() { 
     [foo]::DoAnything() #works 

     #$this.DoAnything #not working 

     $static_this = [foo] 
     $static_this::DoAnything() #works 

    } 
    static [void]DoAnything() { 
     echo "Done" 
    } 
} 

[foo]::DoSomething() 
+0

Lỗi: _không có sẵn_ –

+2

Đây thực chất là bản sao của câu hỏi này: http://stackoverflow.com/questions/2113069/c-sharp-getting-its-own-class-name. Thật là lộn xộn khi làm những gì bạn yêu cầu (đối với các phương thức tĩnh) trong C# vì nó nằm trong PowerShell. –

+0

@Chris Dent: '[System.Reflection.MethodBase] :: GetCurrentMethod(). DeclaringType' dường như không hoạt động. Các thuộc tính của 'GetCurrentMethod()' kết quả chỉ ra rằng phương thức là động. Dù sao trong C# bạn có thể gọi DoAnything từ DoSomething mà không có tham chiếu đầy đủ là 'static void DoSomething() {DoAnything(); } '. Chính xác điều này tôi đang thiếu trong PowerShell. –

Trả lời

1

lớp tĩnh không có this con trỏ. Xem MSDN

Chức năng thành viên tĩnh, vì chúng tồn tại ở cấp lớp và không như một phần của đối tượng, không có con trỏ này. Đó là lỗi khi đề cập đến điều này theo phương pháp tĩnh.

Bạn phải gọi phương thức theo tên lớp.

+0

Cảm ơn bạn đã trả lời nhanh Pawel, nhưng dường như đề xuất của bạn không giải quyết được vấn đề. Như tôi đã chỉ ra trong câu hỏi của tôi có ít nhất một cách giải quyết '$ static_this = [foo]'. Chỉ cần tìm kiếm tốt hơn. –

Các vấn đề liên quan