2010-02-10 28 views
12

Tôi đang tìm một thuật toán có thể lấy đối tượng gọi là phương thức, trong phương thức đó.Lấy cá thể gọi là phương thức trong C#

Ví dụ:

public class Class1 { 

    public void Method() { 
     //the question 
     object a = ...;//the object that called the method (in this case object1) 
     //other instructions 
    } 

} 

public class Class2 { 

    public Class2() { 
     Class1 myClass1 = new Class1(); 
     myClass1.Method(); 
    } 

    public static void Main() { 
     Class2 object1 = new Class2(); 
     //... 
    } 

} 

Có cách nào để làm điều này?

+6

Tôi có một câu hỏi, bạn sẽ làm gì với nó khi bạn có nó? Nếu bạn cần để có được một tham chiếu đến các đối tượng gọi điện thoại thì tại sao không chỉ vượt qua nó trong như một tham số? – Lazarus

+0

Dupe? http://stackoverflow.com/questions/420541/is-there-any-way-to-get-a-reference-to-the-calling-object-in-c – CraigTP

+1

Tôi tò mò: Trường hợp sử dụng là gì? Tại sao bạn nghĩ rằng bạn cần phải làm điều này? –

Trả lời

-2

Rõ ràng tôi không biết các chi tiết chính xác về tình hình của bạn, nhưng điều này thực sự có vẻ như bạn cần phải suy nghĩ lại cấu trúc của bạn một bit.

Điều này có thể dễ dàng thực hiện nếu kế thừa đúng được cấu trúc.

Xem xét xem xét một lớp trừu tượng và các lớp học kế thừa từ lớp trừu tượng đã nói. Bạn thậm chí có thể thực hiện được điều tương tự với các giao diện.

0

Bạn có thể truy cập dấu vết ngăn xếp hiện tại trong mã và đi bộ lên một bước. http://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace.aspx

Nhưng như đã được nhận xét dưới đây, điều này sẽ giúp bạn phương thức và lớp gọi bạn, nhưng không phải là trường hợp (nếu có, có thể là một khóa học tĩnh).

+0

Vấn đề với điều này nó sẽ có thể cung cấp cho những gì được gọi là nó. Không phải trường hợp của đối tượng gọi nó. –

+0

Có, bạn đã đúng. Câu hỏi đề cập đến trường hợp, do đó, điều này sẽ không hoạt động. –

0

Sẽ rất phong cách xấu từ

a) rằng sẽ phá vỡ đóng gói
b) nó không thể biết loại đối tượng gọi điện thoại tại thời gian biên dịch vì vậy bất cứ bạn làm với các đối tượng sau, nó sẽ không hoạt động.
c) nó sẽ được dễ dàng hơn/tốt hơn nếu bạn chỉ muốn vượt qua các đối tượng để các nhà xây dựng hoặc phương pháp, như:

Class1 c1 = new Class1(object1); 
+3

Đóng gói là một tính năng ngôn ngữ được thực thi bởi trình biên dịch. Chúng ta có thể phá vỡ nó bằng mọi cách trong thời gian chạy (ví dụ, sử dụng sự phản chiếu, chúng ta có thể sửa đổi các trường riêng). – jason

+0

Nó không phải là không thể bởi vì nó phá vỡ đóng gói (rất nhiều điều có thể làm điều đó). Đó là một ý tưởng rất tồi * vì điều đó. :-) –

+1

Vâng, tôi muốn nói "Không thể" hơn là giải thích "Nó không phải là một ý tưởng tốt, bởi vì ..." và sau đó nhận được phản ứng "Yeah, yeah, tôi đã không nghe công cụ của bạn trên phong cách xấu và bất cứ điều gì và ý tưởng của tôi nghe có vẻ tuyệt vời vì vậy tôi sẽ chỉ làm điều đó ". – dbemerlin

-3

hoặc chỉ cần vượt qua các đối tượng như tham số phương pháp.

public void Method(object callerObject) 
{ 
.. 
} 

và gọi Phương pháp:

myClass.Method(this); 

regards, Florian

7

Dưới đây là một ví dụ về làm thế nào để làm điều này ...

... 
using System.Diagnostics; 
... 

public class MyClass 
{ 
/*...*/ 
    //default level of two, will be 2 levels up from the GetCaller function. 
    private static string GetCaller(int level = 2) 
    { 
     var m = new StackTrace().GetFrame(level).GetMethod(); 

     // .Name is the name only, .FullName includes the namespace 
     var className = m.DeclaringType.FullName; 

     //the method/function name you are looking for. 
     var methodName = m.Name; 

     //returns a composite of the namespace, class and method name. 
     return className + "->" + methodName; 
    } 

    public void DoSomething() { 
     //get the name of the class/method that called me. 
     var whoCalledMe = GetCaller(); 
     //... 
    } 
/*...*/ 
}

viết bài này, bởi vì nó đã cho tôi một thời gian để tìm thấy những gì tôi đang tìm kiếm bản thân mình. Tôi đang sử dụng nó trong một số phương pháp logger tĩnh ...

+2

Tôi nên lưu ý, rằng điều này sẽ không làm việc cho nhu cầu của bạn, như bạn muốn thể hiện của đối tượng đã cho ... trong trường hợp đó bạn nên suy nghĩ lại. – Tracker1

+5

Chạy ứng dụng này ở chế độ phát hành và trình biên dịch sẽ tối ưu hóa callstack, điều này sẽ gây ra sự cố cho bạn. Trong .NET 4.5 bây giờ có thuộc tính 'CallerMemberName' –

+7

Đó là nó! Tôi thực sự từ chối bình luận như @Lazarus được thực hiện ('Tại sao bạn thậm chí cần điều này') và thậm chí nhiều hơn rằng họ đang nhận được upvoted. Tôi cần điều này cho chính xác cùng một điều như bạn, logger tĩnh được gọi bởi nhiều chủ đề. – Mike

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