我的代码:
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 都用于存储它(无论是谁调用)。例如,我的列表如下所示:
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
将为真并分配第一个设备,但现在对于其他设备 pp==null
将为假,因此我无法与其他设备通话。如果需要更多详细信息,请告诉我。
最佳答案
从 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/