在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