在C#中是否可能知道谁调用了静态属性/访问器?

在C#中是否可能知道谁调用了静态属性/访问器?,c#,properties,static,accessor,C#,Properties,Static,Accessor,我的代码: public class CLASS_A { public static Dictionary<int, CLASS_A> List = new Dictionary<int, CLASS_A>; public static PP_CLASS pp = null; public static CLASS_A ID { get { int key = get_threadID; if (List.ContainsKey(key

我的代码:

public class CLASS_A {    

public static Dictionary<int, CLASS_A> List = new Dictionary<int, CLASS_A>;
public static PP_CLASS pp = null;

 public static CLASS_A ID
 {
  get
  {
   int key = get_threadID;
   if (List.ContainsKey(key))
     return List[key];
   else
     return null;
   }
   set
   {
    int key = get_threadID;
    List[key] = value;
    }
   }

  public virtual void init(lib, name)
  {
    ...
    if (name != "")
    {
      if (pp == null)
       PP = this;
    } 
    ...
  }
}  
但是现在,当另一个线程在pp上调用一个方法时,比如说
CLASS_a.pp.setWelcome
,这将为pp返回null,并抛出null异常!因为调用set时,线程id将不同,并且不在列表中

那么,我是否有可能知道调用了哪个对象,以便进行反向查找?或者是一个不同的解决方案

我想要这个的原因: 最初我们连接到一个设备,这样就可以了。现在有多个设备,每个设备都有自己的ip/端口。初始代码只有
公共静态PP_类PP=null
所以其他人只需使用类名调用pp上的方法,一切都很好

以前的行为:软件从文件中选择设备列表,因为pp是静态的,所以它只与第一个设备对话。我添加了我在第一篇文章中忘记的
pp==null
行。因此,当代码开始时,
pp==null
将为true,并分配第一个设备,但现在对于其他设备,
pp==null
将为false,因此我无法与其他设备通话


如果需要更多详细信息,请告诉我。

您可以尝试检查堆栈跟踪

var trace = new System.Diagnostics.StackTrace();
或者,要仅获取呼叫线路,它应该类似于:

var caller = new System.Diagnostics.StackTrace().GetFrame(1)
从(2012年8月)开始,有一个新功能“”。如果类存储在单独的文件中,则可以使用
CallerFilePathAttribute
注册实际调用的类

示例来自:


能否将属性更改为方法并为“调用者”添加参数?然后只需跟踪编译器向您抛出的所有错误。如果一个线程调用
init
,而另一个线程尝试使用
pp
,您的问题不清楚您希望发生什么。请告诉我们更多有关您的用例的信息。为什么要以线程作为键来存储对象?每个线程不会有单独的PP实例,在调用PP后,所有线程都会有一个共享的PP。这没有多大意义,因为它代表PP,并且ID属性没有关系。我想知道您是否正在寻找ThreadStatic:。另外-使用List作为标识符不是一件好事。我最初考虑过这一点,但有很多文件,这是不切实际的。我还建议使用该类,因为它可以为调用它的每个线程处理对象的唯一实例的自动实例化,这就是您的代码似乎要做的。这很有趣。(过去总是使用stacktrace,这看起来更简单)
var caller = new System.Diagnostics.StackTrace().GetFrame(1)
// using System.Runtime.CompilerServices 
// using System.Diagnostics; 

public void DoProcessing()
{
    TraceMessage("Something happened.");
}

public void TraceMessage(string message,
        [CallerMemberName] string memberName = "",
        [CallerFilePath] string sourceFilePath = "",
        [CallerLineNumber] int sourceLineNumber = 0)
{
    Trace.WriteLine("message: " + message);
    Trace.WriteLine("member name: " + memberName);
    Trace.WriteLine("source file path: " + sourceFilePath);
    Trace.WriteLine("source line number: " + sourceLineNumber);
}

// Sample Output: 
//  message: Something happened. 
//  member name: DoProcessing 
//  source file path: c:\Users\username\Documents\Visual Studio 2012\Projects\CallerInfoCS\CallerInfoCS\Form1.cs 
//  source line number: 31