Если возможность определить тип унаследованного класса во время выполнения более важна, чем производительность, вы можете взглянуть на StackTrace, чтобы узнать, откуда вызывается конструктор.При вызове GetInheritedClassName в этом примере вам может потребоваться написать больше предположений:
public abstract class BaseClass : VeryBaseClass
{
private static string GetInheritedClassName
{
get
{
// Get the current Stack
StackTrace currentStack = new StackTrace();
MethodBase method = currentStack.GetFrame(1).GetMethod();
// 1st frame should be the constructor calling
if (method.Name != ".ctor")
return null;
method = currentStack.GetFrame(2).GetMethod();
// 2nd frame should be the constructor of the inherited class
if (method.Name != ".ctor")
return null;
// return the type of the inherited class
return method.ReflectedType.Name;
}
}
public BaseClass(MyObject myObject) :
base(GetInheritedClassName, myObject)
{
}
}
Я не могу придумать отличный способ динамически получить имя унаследованного класса без влияния на производительность.Я понимаю, что вы хотели избежать, но если бы мне нужно было вызывать стороннюю сборку с этими требованиями, я бы просто потребовал, чтобы каждый класс указывал свой собственный тип:
public abstract class BaseClass : VeryBaseClass
{
public BaseClass(string className, MyObject myObject) :
base(className, myObject)
{
}
}
public class InheritedClass : BaseClass
{
public InheritedClass(MyObject myObject) : base("InheritedClass", myObject)
{
}
}