Сделать это частным вложенным классом, который реализует определенный интерфейс. Тогда, только внешний класс может его создать, но любой может его использовать (через интерфейс). Пример:
interface IParameter
{
string Name { get; }
string Value { get; }
}
class Descriptor
{
public string Name { get; private set; }
public IList<IParameter> Parameters { get; private set; }
private Descriptor() { }
public Descriptor GetByName(string Name) { ... }
class Parameter : IParameter
{
public string Name { get; private set; }
public string Value { get; private set; }
}
}
Если вы действительно должны избегать интерфейса, вы можете создать открытый абстрактный класс, который имеет все свойства, но объявляет защищенный конструктор. Затем вы можете создать частный вложенный класс, который наследует от общего реферата, который может быть создан только внешним классом, и вернуть его экземпляры в качестве базового типа. Пример:
public abstract AbstractParameter
{
public string Name { get; protected set; }
public string Value { get; protected set; }
}
class Descriptor
{
public string Name { get; private set; }
public IList<AbstractParameter> Parameters { get; private set; }
private Descriptor() { }
public Descriptor GetByName(string Name) { ... }
private class NestedParameter : AbstractParameter
{
public NestedParameter() { /* whatever goes here */ }
}
}