Нет. В качестве альтернативы вы можете принять лямбду в качестве аргумента, который также дает вам полный контроль над тем, какая часть процесса «создания» будет вызвана. Таким образом, вы можете назвать это как:
MyClass instance = MyClass.FactoryCreate(c=>
{
c.SomeProperty = something;
c.AnotherProperty = somethingElse;
});
Создание будет выглядеть примерно так:
public static MyClass FactoryCreate(Action<MyClass> initalizer)
{
MyClass myClass = new MyClass();
//do stuff
initializer( myClass );
//do more stuff
return myClass;
}
Другой вариант - вместо этого вернуть построитель (с неявным оператором приведения к MyClass). Который вы бы назвали, как:
MyClass instance = MyClass.FactoryCreate()
.WithSomeProperty(something)
.WithAnotherProperty(somethingElse);
Проверьте это для строителя
Обе эти версии проверяются во время компиляции и имеют полную поддержку intellisense.
Третий вариант, для которого требуется конструктор по умолчанию:
//used like:
var data = MyClass.FactoryCreate(() => new Data
{
Desc = "something",
Id = 1
});
//Implemented as:
public static MyClass FactoryCreate(Expression<Func<MyClass>> initializer)
{
var myclass = new MyClass();
ApplyInitializer(myclass, (MemberInitExpression)initializer.Body);
return myclass ;
}
//using this:
static void ApplyInitializer(object instance, MemberInitExpression initalizer)
{
foreach (var bind in initalizer.Bindings.Cast<MemberAssignment>())
{
var prop = (PropertyInfo)bind.Member;
var value = ((ConstantExpression)bind.Expression).Value;
prop.SetValue(instance, value, null);
}
}
Это среднее между проверенным во время компиляции и не проверенным. Это требует некоторой работы, так как оно вызывает постоянное выражение в присваиваниях. Я думаю, что все остальное - вариации подходов, которые уже есть в ответах. Помните, что вы также можете использовать обычные задания, подумайте, действительно ли вам это нужно.