2011-06-09 105 views
0

我想知道如果我能得到物体称为静态类的静态方法 例如:嵌套静态类C#

public class Person 
{ 
    private static class TelephoneLine 
    { 
     public static string sharedString = string.Empty; 
     public static void NotifyOnCall() 
     { 
      //notify if someone call this person 
     } 
     public static void Comunicate(Person comunicateWith, string message) 
     { 
      sharedString = "Sender: " /* Object which called that method */ + " To: " + comunicateWith.Name + 
          " said: " + message; 
     } 
    } 
    public Person(string name) 
    { 
     Name = name; 
    } 
    string Name; 
    public void CallTo(Person person, string message) 
    { 
     TelephoneLine.Comunicate(person, message); 
    } 
    public void ShowCall() 
    { 
     Console.Write(TelephoneLine.sharedString); 
    } 
} 

}

那么,有没有可能获得“发件人”只是路过它在ThelephoneLine.Comunicate(this,comunicateWith,msg)的参数中?

+0

如何关系到(嵌套)静态类这个问题:

class TelephoneLine { public TelephoneLine (Person sender, Person receiver) { m_sender = sender; m_receiver = receiver; } public void Send (Person from, String message) { if (from == sender) { output "From: " + m_sender + " To: " + m_receiver + " Message: " + message; } else { output "From: " + m_receiver + " To: " + m_sender + " Message: " + message; } } Person m_sender, m_receiver; }; class Person { public void MakeCall (Person receiver, string message) { TelephoneLine line = new TelephoneLine (this, receiver); line.Send (this, message); } } 

事实上,TelephoneLine对象应该被别的东西所拥有? – CodesInChaos 2011-06-09 14:32:18

回答

2

它可以使用堆栈爬取(只要你防止你的静态方法被内联),但它通常是一个坏主意。

Retrieving the calling method name from within a method

做这行,如果细调试目的。这样做是因为你懒得把它明确写入正常的程序流程,这是非常糟糕的设计。所以在你的情况下,我强烈建议手动传递它。


有点偏离主题,但我敢肯定你的类不应该是静态的。静态方法适用于简单的无副作用函数(有关示例,请参见MathEnumerable)。你的TelephoneLine至少应该是一个Singleton,但IMO应该简单地使用依赖注入并注入它的一个实例。

0

简单的答案是否定的。很多.NET自己的事件(WinForms或ASP中的点击等)都要求您传递“发件人”参数。

您可以查看堆栈以获取方法的名称,甚至可能是调用方的类型,但您肯定无法获取调用该函数的特定对象。

0

的一种方法是定义者和服务之间的通用接口,并使用其合同来传递数据:

通用的解决方案可能是矫枉过正嵌套私人服务类,但你可能要扩大什么可以打电话后重新公开,例如自动服务呼叫等。

public interface ICallable { string CallerIdString(); } 

public class Person : ICallable 
{ 
    private static class TelephoneLine 
    { 
     public static string sharedString = string.Empty; 
     public static void NotifyOnCall() 
     { 
      //notify if someone call this person 
     } 
     public static void Comunicate<TCaller>(TCaller Caller, Person comunicateWith, string message) where TCaller : ICallable 
     { 
      sharedString = "Sender: " + Caller.CallerIdString() + " To: " + comunicateWith.Name + 
          " said: " + message; 
          sharedString.Dump(); 
     } 
    } 
    public Person(string name) 
    { 
     Name = name; 
    } 
    string Name; 
    public void CallTo(Person person, string message) 
    { 
     TelephoneLine.Comunicate<Person>(this, person, message); 
    } 
    public void ShowCall() 
    { 
     Console.Write(TelephoneLine.sharedString); 
    } 

    public string CallerIdString() { return this.Name;} 
} 
0

的TelephoneLine类真的不应该由一个人(他们是由电话公司拥有的!)所拥有,他们真的不应该是静态的(静态==码味)。

class Exchange 
{ 
    public TelephoneLine MakeCall (Person from, Person to) 
    { 
    // check that 'to' can receive call first! 
    return new TelephoneLine (from, to); 
    } 
}; 

class Person 
{ 
    public void MakeCall (Person receiver, string message) 
    { 
    TelephoneLine line = the_exchange.MakeCall (this, receiver); 
    if (line != null) 
    { 
     line.Send (this, message); 
    } 
    // else, receiver not listening! 
    } 
}