gpt4 book ai didi

c# - 这是操纵子类型集合的唯一 DRY 方法吗?

转载 作者:行者123 更新时间:2023-11-30 23:02:25 24 4
gpt4 key购买 nike

在一个项目中,我有一组实现抽象基类的类...

public abstract class BaseClass
{
Guid Id { get; set; }
string Name { get; set; }
string Property { get; set; }
}

public class Foo : BaseClass

public class Bar : BaseClass

/*etc*/

...对于另一个类,我需要在集合中对它们执行一些操作。唯一需要操作的是基类的成员。由于集合的原因,为每种类型编写一个方法有点重复,我觉得我错过了一些东西。这是我到目前为止所拥有的:

public ICollection<BaseClass> Transform(ICollection<BaseClass> source, Guid newId, Func<BaseClass> factory)
{
ICollection<BaseClass> result = new List<BaseClass>();

foreach (BaseClass x in source)
{
BaseClass record = factory();

record.Id = newId;
record.Name = x.Name;
record.Property = x.Property;

result.Add(record);
}

return result;
}

public ICollection<Foo> TransformFoos(ICollection<Foo> source, string property)
{
Func<BaseClass> factory = () => new Foo();
ICollection<BaseClass> sourceAsBase = source.Select(x => (BaseClass)x).ToList();
ICollection<Foo> result = this.Transform(sourceAsBase, property, factory)
.Select(x => (Foo)x)
.ToList();
return result;
}

public ICollection<Bar> TransformBars(ICollection<Bar> source, string property)

/*etc*/

不过,这是一个很多的转变。有没有更好的办法?

最佳答案

几乎任何时候当您看到代码做着完全相同的事情但类型不同时,这就意味着您应该使用泛型。在这里,您可以简单地使您的转换方法通用,将其限制为基类类型,一切就绪。

public List<T> Transform<T>(IEnumerable<BaseClass> source, string property)
where T : BaseClass, new()
{
return source.Select(sourceItem => new T()
{
Id = sourceItem.Id,
Name = sourceItem.Name,
Property = property,
}).ToList();
}

关于c# - 这是操纵子类型集合的唯一 DRY 方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50497283/

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