Насколько я знаю, это не может быть сделано по-настоящему из-за того, как C # обрабатывает экземпляры объектов. Чтобы вызвать конструктор, экземпляр должен быть фактически создан, и вы не можете просто «вернуть» другой объект из конструктора.
Лучшее, что я могу придумать (кроме использования фабричного метода), - это обращаться с классом внутри как синглтоном и создавать «фиктивные» экземпляры, которые при создании просто указывают на этот исходный экземпляр. Так, например, в своем конструкторе вы должны проверить, инициализирован ли синглтон, а если нет, инициализировать его, то вы просто перенаправите методы и свойства каждого экземпляра обратно на синглтон.
В этой реализации синглтон не обязательно должен быть одним и тем же классом, но вы можете это сделать, если хотите сохранить содержимое.
Обновление: Один недостаток этого подхода состоит в том, что хотя каждый экземпляр ведет себя как одиночный объект, он все равно будет иметь собственную ссылку на объект, и поэтому вы также можете захотеть переопределить Equals()
для сравнения на равенство.