Почему бы не использовать статическую фабричную функцию вместо конструктора?
например,
public abstract class Class<This> : MarshalByRefObject where This : Class<This>
{
public static Class<This> Build()
{
var instance = (This)new ClassProxy<This>().GetTransparentProxy();
}
protected Class()
{
}
}
Это чрезвычайно трудно неправильно использовать, и в нем нет тех же проблем состояния гонки, которые вы требовалиблокировка потока для.
Полагаю, это означает, что все подклассы также должны были бы сделать свой конструктор по умолчанию закрытым.Это вне вашего контроля?
Редактировать:
Если вы хотите гарантировать, что он не может быть вызван, заставьте конструктор выдать исключение throw new InvalidOperationException("Direct use of the constructor is forbidden. Use Build() instead.");
, и ваш метод GetTransparentProxy
не должен вызывать new
для создания объекта, а вместо этого использовать FormatterServices.GetUninitializedObject()
для обхода конструктора.Это должно позволить создать экземпляр, но он немного пахнет кодом.
Примерно так:
public abstract class Class<This> : MarshalByRefObject where This : Class<This>
{
public static Class<This> Build()
{
// Ensure GetTransparentProxy() calls FormatterServices.GetUninitializedObject() to create the object, rather than calling `new`
var instance = (This)new ClassProxy<This>().GetTransparentProxy();
}
protected Class()
{
throw new InvalidOperationException("Direct use of the constructor is forbidden. Use Build() instead.");
}
}