C#中的Kotlin“apply”等效项

kpbpu008  于 2022-12-13  发布在  Kotlin
关注(0)|答案(6)|浏览(279)

当使用Kotlin时,可以使用apply来设置现有对象的多个属性并保持代码简洁,例如,而不是:

person.firstName = "John"
person.lastName = "Doe"
person.phone = "123 456 789"

我们可以用途:

person.apply {
   firstName = "John"
   lastName = "Doe"
   phone = "123 456 789"
}

在C#中是否有apply的对等用法?
最接近的是using,但据我所知,它不能这样使用。
编辑:我知道C#中的 object initializer,但我实际上是在寻找可以对现有对象(例如,从数据库中获取的对象)执行的操作。

kiayqfof

kiayqfof1#

试试这个.... https://dev.to/amay077/kotlins-scope-functions-in-c-pbn
下面粘贴的代码是为了方便,但上面的链接是源代码...

static class ObjectExtensions 
{
  // Kotlin: fun <T, R> T.let(block: (T) -> R): R
  public static R Let<T, R>(this T self, Func<T, R> block) 
  {
    return block(self);
  }

  // Kotlin: fun <T> T.also(block: (T) -> Unit): T
  public static T Also<T>(this T self, Action<T> block)
  {
    block(self);
    return self;
  }   
}

可以这样使用......。

var model = new MyModel().Also(m => {
  m.Initialize();
  m.Load(path);
});
nnsrf1az

nnsrf1az2#

您可以通过以下方式将其用于对象初始值设定项:

var person = new Person
{
   FirstName = "John",
   LastName = "Doe",
   Phone = "123 456 789"
};

或者使用构造函数:

var person = new Person("John", "Doe", "123 456 789");

对于构造函数选项,类必须如下所示:

class Person
{
    public Person(string firstName, string lastName, string phone)
    {
        FirstName = firstName;
        LastName = lastName;
        Phone = phone;
    }

    public string FirstName { get;set; }
    public string LastName { get;set; }
    public string Phone { get;set; }
}
5hcedyr0

5hcedyr03#

C#(版本8)目前不支援对象初始化之外的群组多重属性指派。
类似的支持存在于VB .NET中,并已被提议用于C#9。
一点历史背景
在Visual Basic.NET中有类似的语句-With

With person
        .FirstName = "John"
        .LastName = "Doe"
        .Phone = "123 456 789"
    End With

这个版本是从Visual Basic 6中移植的,用于向后兼容(以前的非.NET语言版本)。
C#团队(Anders Heilsberg自己在某个地方讲过这个故事)认为With语句降低了代码的可读性,不想在语言中引入它。从我所看到的来看,With语句可以被嵌套,可以造成相当混乱的情况。
正如许多其他人已经提到的,有一个非常相似的对象初始化器语法:

var person = new Person
{
   firstName = "John",
   lastName = "Doe",
   phone = "123 456 789"
};

未来- C# 9

正如在另一个(删除的)答案中指出的,有一个open proposal for records和With表达式,要在C# 9中添加:

person with { firstName = "John", lastName = "Doe", phone = "123 456 789" };

额外提示

然而,我能给予你的最重要的建议是,为了避免打扰可能在你的代码上工作的C#开发人员--我们在C#中不对公共属性和方法使用camelCase,因为C#不是Java。我们使用PascalCase!:)

jrcvhitl

jrcvhitl4#

使用对象初始值设定项:

var person = new Person
{
   firstName = "John",
   lastName = "Doe",
   phone = "123 456 789"
};

在你已经有了对象之后,你可以给予自己一个短变量:

var p = person;
p.firstName = "Jane";
p.lastName = "Smith";
p.phone = "987 654 321";

//later:
Console.WriteLine(person.lastName); //will output "Smith"

这比apply选项的代码更少。

thtygnil

thtygnil5#

Object initializers允许您这样做,但仅在对象示例化时。
喜欢

var person = new Person
{
   FirstName = "John",
   LastName = "Doe",
   Phone = "123 456 789"
}
dgsult0t

dgsult0t6#

在将Apply复制到几个项目中之后,我做了一个nuget包。
dotnet add package Object.Extensions.ScopeFunction
它提供了扩展方法ApplyApplyForEachMap(可以覆盖return)。

var permissionsMissingTestContext = new TestContext
{
    Users = GetStandardUsers().ApplyForEach(x => x.Permissions = new Permission[0]),
    SecurityPolicy = GetStandardSecurityPolicy().Apply(x => x.ShowWarningWhenPermissionsMissing = true),
    AnonymousPageUrl = GetStandardConfig().Map(x => new Url(x.PermissionsMissingScreenUrl)),
    Timeout = GetTestTimeout()?.Map(x => TimeSpan.FromSeconds(x)) ?? TimeSpan.FromSeconds(30)
}

Nuget

相关问题