我有一个带有静态工厂方法的类.我想调用工厂来检索类的实例,然后通过c#object initializer语法进行额外的初始化:
MyClass instance = MyClass.FactoryCreate() { someProperty = someValue; }
VS
MyClass instance = MyClass.FactoryCreate(); instance.someProperty = someValue;
eglasius.. 28
不然.或者您可以接受lambda作为参数,这也可以让您完全控制"创建"过程的哪一部分将被调用.这样你就可以这样称呼它:
MyClass instance = MyClass.FactoryCreate(c=> { c.SomeProperty = something; c.AnotherProperty = somethingElse; });
创建看起来类似于:
public static MyClass FactoryCreate(Actioninitalizer) { 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> 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 ()) { var prop = (PropertyInfo)bind.Member; var value = ((ConstantExpression)bind.Expression).Value; prop.SetValue(instance, value, null); } }
它是在编译时检查而未检查的中间.它确实需要一些工作,因为它强制在赋值上不断表达.我认为其他任何东西都是答案中已有方法的变体.请记住,您也可以使用正常的作业,考虑是否真的需要这些作业.
不然.或者您可以接受lambda作为参数,这也可以让您完全控制"创建"过程的哪一部分将被调用.这样你就可以这样称呼它:
MyClass instance = MyClass.FactoryCreate(c=> { c.SomeProperty = something; c.AnotherProperty = somethingElse; });
创建看起来类似于:
public static MyClass FactoryCreate(Actioninitalizer) { 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> 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 ()) { var prop = (PropertyInfo)bind.Member; var value = ((ConstantExpression)bind.Expression).Value; prop.SetValue(instance, value, null); } }
它是在编译时检查而未检查的中间.它确实需要一些工作,因为它强制在赋值上不断表达.我认为其他任何东西都是答案中已有方法的变体.请记住,您也可以使用正常的作业,考虑是否真的需要这些作业.