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

标签 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))
     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;
    } 
    ...
  }
}  

因此无论哪个线程调用 init,它的 id 都用于存储 this(无论调用者是谁)。例如,我的列表如下所示:

45 = CLASS_A_object0
67 = CLASS_A_object1
...

但是现在当不同的线程调用 pp 上的方法时,比如 CLASS_A.pp.setWelcome,这将为 pp 返回 null,并抛出 null 异常!因为当调用 set 时,线程 ID 将不同并且不会在列表中。

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

为什么我想要这个: 最初我们连接到一个设备,所以没问题。现在有多个设备,每个设备都有自己的 ip/端口。初始代码只有 public static PP_CLASS pp = null; 所以其他人将只是使用类名调用 pp 上的方法,一切都很好。

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

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

最佳答案

C# 5.0 开头(2012 年 8 月)有一个新功能“Caller Info Attribute”。如果您的类存储在单独的文件中,您可以使用 CallerFilePathAttribute 来注册实际调用了哪个类。

示例来自 MSDN :

// 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

关于c# - 在 C# 中是否有可能知道谁调用了静态属性/访问器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15799336/

相关文章:

c# - 标签不显示文本 - Xamarin IOS

c# - 捕获插件 UserControl 抛出的异常

c# - 在 Rx 中实现滑动窗口的问题

ios - 当应用程序部署到应用商店时,隐藏 @property 不被用户看到

javascript cloneNode 和属性

java - 使用静态修饰符跟踪对象实例

c - 静态结构初始化

c# - 使用 VS2017 在 Azure Function 中复制 Blob

properties - 使用 std::vector<> 作为 Objective-C 属性

database - 非常非常简单、安全的静态站点数据库