gpt4 book ai didi

c# - 无需手动多次循环即可将文本添加到列表所有项目的所有属性

转载 作者:太空宇宙 更新时间:2023-11-03 22:38:56 24 4
gpt4 key购买 nike

我有一个 MyClass 列表

public class MyClass
{
public string Title { get; set; }
public string Name { get; set; }
}


var records = new List<MyClass>
{
new MyClass { Title = "Mr", Name = "Bob" },
new MyClass { Title = "Dr", Name = "Jon" },
};

我需要在类的每个属性和列表中的每个项目的每个值周围添加“”。所以每个属性的实际内容在开始和结束时都包含一个 "。

有没有一种方法可以添加它,而不必遍历每个属性和项目并手动完成所有操作。也许是一种使用 Linq 的方法?

我在 Google 上找不到任何东西,我什至不确定要搜索什么。

谢谢

最佳答案

是的,简单映射转换:

var transformedRecords =  
records.Select(c =>
new MyClass
{
Title = $"\"{c.Title}\"",
Name = $"\"{c.Name}\""
});

现在,如果您想要一种编辑所有 string 属性的方法,而不必逐个手动更改它们,那么唯一的方法就是使用反射:

static void Transform<T>(T t)
where T: class
{
if (ReferenceEquals(t, null))
throw new ArgumentNullException(nameof(t));

var propertiesToEdit =
typeof(T).GetProperties(BindingFlags.Public |
BindingFlags.Instance)
.Where(p => p.PropertyType == typeof(string)
p.CanWrite &&
p.CanRead);

foreach (var p in propertiesToEdit)
{
p.SetValue(t, $"\"{p.GetValue(t)}\"");
}
}

但现在您已经有了一个方法,可以改变传入的对象。切勿将变异方法与 LINQ 一起使用,意料之外的行为是意料之中的。

所以你最好只是简单地手动迭代:

foreach (var r in records)
Transform(r);

现在您的 records 列表将包含变异的项目。

当然,你不需要在 string 处停下来,你可以用很少的额外成本让它变得更通用:

static void Transform<T, Q>(T t, Func<Q, Q> transform)
where T: class
{
if (ReferenceEquals(t, null))
throw new ArgumentNullException(nameof(t));

var propertiesToEdit =
typeof(T).GetProperties(BindingFlags.Public |
BindingFlags.Instance)
.Where(p => p.PropertyType == typeof(Q)
p.CanWrite &&
p.CanRead);

foreach (var p in propertiesToEdit)
{
p.SetValue(t, transform((Q)p.GetValue(t)));
}
}

现在你可以像这样使用它:

foreach (var r in records)
Transform(r, (string s) => $"\"{s}\"");

class 约束在这里很重要,因为它会因值类型而失败; c# 默认按值语义传递,因此该方法将改变副本,而不是列表中的原始实例。

关于c# - 无需手动多次循环即可将文本添加到列表所有项目的所有属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53460621/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com