是否可以在函数返回值上使用初始值设定项?

时间:2017-02-04 23:22:19

标签: c#

我想做:

var myClassInstance = myFactory.CreateMyClass() { MyPropertyA = "blah", MyPropertyB = "Bleh"};

但是编译器并不喜欢这样。

周围有吗?我试图避免:

var myClassInstance = myFactory.CreateMyClass();
myClassInstance.MyPropertyA = "blah";
myClassInstance.MyPropertyB = "Bleh";

我知道我说myFactory,但它不是我的。我无法更改CreateMyClass

2 个答案:

答案 0 :(得分:1)

虽然无法完全按照您的要求进行操作,但您可以使用Builder design pattern来提高可读性。

这些方面的东西:

var myClassInstance = myFactory.CreateMyClass()
                               .WithMyPropertyA("blah")
                               .WithMyPropertyB("Bleh");

这可以使用扩展方法或在您自己的构建器类中包装myFactory来完成。

答案 1 :(得分:0)

我会做什么(取决于调用它的频率和性能的重要性):

public class Factory
{
   MyObject CreateMyObject(object source)
   {
    var target = new MyObject();
    CopyPropertiesFromSource(target, source):
    return target;
   }

static void CopyPropertiesFromSource(MyObject target, object source)
{
    var propertiesToInitialize = typeof(MyObject).GetProperties();
    var sourceProperties = source.GetType().GetProperties();
    foreach(var property in propertiesToInitialize)
    {
      var correspondingProperty = sourceProperties.FirstOrDefault(x => x.Name == property.Name && x.PropertyType == property.PropertyType);

    if(correspondingProperty == null)
       continue;

      property.SetValue(target, correspondingProperty.GetValue(source));
    }
  }
}

var myClassInstance = new Factory().CreateMyObject({ MyPropertyA = "blah" });