Как получить имя класса, в котором объект инициализируется С#

У меня есть несколько классов. Давайте скажем:

public class A
{
 public void SomeAction()
 {
 Debug.Write("I was declared in class: and my name is:");
 }
}

А также

public class B
{
 public static A myClass = new A();
}

public class C
{
 public static A myClass = new A();
}

public class D
{
 public static A myClass = new A();
}

То, что я хочу, чтобы "SomeAction" в классе A выполнял, - это распечатать, какой класс был инициализирован.

Так, например, в другом классе я назвал C.myClass.SomeAction(); он будет печатать "Я был объявлен в классе C меня зовут myClass "

Я надеюсь в этом есть смысл.

Причины этого делают для отладки в автоматическом тестировании. Я понимаю, что это не лучший способ сделать что-то, но это требование бизнеса.

3 ответа

Это требование может быть выполнено без наследования или передачи объекта; мы можем получить имя класса, вызывающего конструктор из тела конструктора, путем изучения стека.

public class A
{
 private string _createdBy;

 public void SomeAction()
 {
 Console.WriteLine("I was declared in class [{0}]", _createdBy);
 }

 public A()
 {
 var stackFrame = new StackFrame(1);
 var method = stackFrame.GetMethod();
 _createdBy = method.DeclaringType.Name;
 }
}

Что касается производительности, я предполагаю, что вы не создаете много экземпляров этих объектов. Вы также можете предикатировать это по поводу того, выполняете ли вы конструкцию DEBUG или какие-то другие настройки, чтобы этот материал полностью пропущен в ваших исполняемых файлах.


Поскольку вы ссылаетесь только на экземпляр класса A в других классах, я думаю, что нет другого способа установить ссылку на тип, который создал класс A, как уже упоминалось eddie_cat. Вы могли бы сделать что-то вроде этого:

public class B
{
 public static A myClass = new A(typeof(B));
}

И тогда ваш класс A будет выглядеть так:

public class A
{
 // store the parent type
 private Type mParentClass; 

 // provide parent type during construction of A
 public A(Type parentClass)
 {
 mParentClass = parentClass;
 } 

 // note that method cannot be static anymore, since every instance of A might 
 // have a different parent
 public void SomeAction()
 {
 // access field where parent type is stored.
 Debug.Write("I was declared in class: {0} and my name is:",mParentClass.Name);
 }
}


Я думаю, у вас есть два выбора. Либо установите свойство в A, либо наследуйте от A. Лично я предпочитаю наследовать от A, потому что тогда A может просто использовать GetType().

public class A
{
 public void SomeMethod()
 {
 Debug.Write(string.Format("I was declared in class: {0}",this.GetType()));
 }
}

public class B : A
{


}

var instanceOfB = new B();
instanceOfB.SomeMethod();

licensed under cc by-sa 3.0 with attribution.