不需要。或者你可以接受一个lambda作为参数,这样你就完全控制了“创建”过程的哪一部分被调用。这样,你可以像这样调用它:
MyClass instance = MyClass.FactoryCreate(c=>
{
c.SomeProperty = something;
c.AnotherProperty = somethingElse;
});
创建过程会类似于:
public static MyClass FactoryCreate(Action<MyClass> initalizer)
{
MyClass myClass = new MyClass();
initializer( myClass );
return myClass;
}
另一种选择是返回一个构建器(带有 MyClass 的隐式转换运算符)。你可以这样调用它:
MyClass instance = MyClass.FactoryCreate()
.WithSomeProperty(something)
.WithAnotherProperty(somethingElse);
查看这里的构造器。
这两个版本都在编译时进行了检查,并具有完整的Intellisense支持。
第三种选项需要一个默认的构造函数:
var data = MyClass.FactoryCreate(() => new Data
{
Desc = "something",
Id = 1
});
public static MyClass FactoryCreate(Expression<Func<MyClass>> initializer)
{
var myclass = new MyClass();
ApplyInitializer(myclass, (MemberInitExpression)initializer.Body);
return myclass ;
}
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);
}
}
这是在编译时进行检查和不检查之间的一种折中方案。它确实需要一些工作,因为它强制要求在赋值时使用常数表达式。我认为其他任何方法都是答案中已经存在的方法的变化。请记住,您还可以使用普通赋值语句,考虑是否真的需要使用此方法。