我正在尝试使用反射来确定我的对象是在哪里创建的。例如:
public class MyClass
{
public int Id { get; set; }
public string Message { get; set; }
}
public static class Students
{
public static class FirstGrade
{
public static MyClass John = new MyClass { Id = 1, Message = "Some Text" };
}
}
现在,在我的代码中的其他地方,我想使用MyClass对象John,通过该对象,我想确定John是在哪里创建的,这样我就可以确定他是一年级的学生。我也想知道对象名称"John",因为这可能会更改:
MyClass student = Students.FirstGrade.John;
我想下面就是您的要求。或者,如果您想知道对象是在哪里真正创建的,而不仅仅是在哪里引用的,那么您可以访问MyClass
构造函数中的System.Diagnostics.StackTrace
对象。
正如其他人所提到的,似乎应该重新考虑这个设计。
public static class Students
{
public static class FirstGrade {
public static MyClass John = new MyClass { Id = 1, Message = "Some Text" };
}
public static class SecondGrade {
public static MyClass John = new MyClass { Id = 2, Message = "Some Text" };
}
public static Type FindStudent(MyClass s, out String varName) {
varName = null;
foreach (var ty in typeof(Students).GetNestedTypes()) {
var arr = ty.GetFields(BindingFlags.Static | BindingFlags.Public);
foreach (var fi in arr) {
if (fi.FieldType == typeof(MyClass)) {
Object o = fi.GetValue(null);
if (o == s) {
varName = fi.Name;
return ty;
}
}
}
}
return null;
}
public static void FindJohn() {
String varName = null;
Type ty = FindStudent(SecondGrade.John, out varName);
MessageBox.Show(ty == null ? "Not found." : ty.FullName + " " + varName);
}
}