C# 是否可以对函数返回值使用初始值设定项?

C# 是否可以对函数返回值使用初始值设定项?,c#,C#,我想做: var myClassInstance=myFactory.CreateMyClass(){MyPropertyA=“blah”,MyPropertyB=“Bleh”}; 但是编译器不喜欢这样 这附近有什么地方吗?我试图避免: var myClassInstance=myFactory.CreateMyClass(); myClassInstance.MyPropertyA=“blah”; myClassInstance.MyPropertyB=“Bleh”; 我知道我说过我的工厂

我想做:

var myClassInstance=myFactory.CreateMyClass(){MyPropertyA=“blah”,MyPropertyB=“Bleh”};
但是编译器不喜欢这样

这附近有什么地方吗?我试图避免:

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

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

虽然不能完全按照您的要求执行,但您可以使用来提高可读性

大致如下:

var myClassInstance = myFactory.CreateMyClass()
                               .WithMyPropertyA("blah")
                               .WithMyPropertyB("Bleh");
这可以通过扩展方法或在自己的builder类中包装
myFactory
来完成。

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


var myClassInstance=new Factory().CreateMyObject({MyPropertyA=“blah”})

根据David Culp的回答,我做了这个扩展函数:

具有的公共静态对象(此对象对象,对象附加属性)
{
var type=additionalProperties.GetType();
foreach(类型为.GetFields()的var sourceField)
{
var name=sourceField.name;
var value=sourceField.GetValue(additionalProperties);
if(type.GetMember(name)[0]是FieldInfo)
type.GetField(name).SetValue(obj,value);
其他的
type.GetProperty(name).SetValue(obj,value);
}
返回obj;
}
它是这样使用的:

var myClassInstance=myFactory.CreateMyClass()。带有(new{MyPropertyA=“blah”,MyPropertyB=“bleh”});
当有很多属性时,它真的会发光

    // insert a new version
    T newVersion = (T)MemberwiseClone();
    newVersion.IsSuspended = true;
    newVersion.RealEffectiveDate = RealExpirationDate;
    newVersion.RealExpirationDate = NullDate;
    newVersion.Version++;
    newVersion.BusinessEffectiveDate = BusinessExpirationDate;
    newVersion.BusinessExpirationDate = NullDate;
变成:

    // insert a new version
    T newVersion = (T)MemberwiseClone().With(new
    {
      IsSuspended = true,
      RealEffectiveDate = RealExpirationDate,
      RealExpirationDate = NullDate,
      Version = Version + 1,
      BusinessEffectiveDate = BusinessExpirationDate,
      BusinessExpirationDate = NullDate

    });

嗯,这不是一个真正的初始化器,因为对象在返回时已经被初始化。不,已经被提议了,但实际上你不能。@Sentry,好的,但是你知道我想做什么了,那么我应该如何更改我的标题?我想标题很好。Alessandro可以链接到该提案,但大多数搜索此功能的人可能会称其为“初始值设定项”,为什么您要避免这种情况?我感觉有一种扩展方法即将出现。谢谢!我们知道如何在周六晚上举行派对。啊——在编辑看来可能不错,但这真的值得反思吗?也许您的原始版本是性能最好(并且更易于维护)的代码……这将要慢几个数量级,并且它会丢失所有静态类型,从而产生许多明显和细微错误的可能性,并且通常会以可枚举的方式抑制代码维护。你甚至没有得到任何好处。代码并不比您试图替换的代码更短或更容易编写。事实上,它比您试图替换的代码更难写出。@Servy,扩展方法是否可以使用lambda来保持类型检查?@toddmo Sure。不过,您实际上并没有从原始代码中获得任何东西,尽管您最终会损失更少。你还是不会从你刚开始的时候得到什么。
    // insert a new version
    T newVersion = (T)MemberwiseClone().With(new
    {
      IsSuspended = true,
      RealEffectiveDate = RealExpirationDate,
      RealExpirationDate = NullDate,
      Version = Version + 1,
      BusinessEffectiveDate = BusinessExpirationDate,
      BusinessExpirationDate = NullDate

    });