gpt4 book ai didi

c# - 包含 LINQ 查询的重构方法

转载 作者:太空狗 更新时间:2023-10-29 21:46:32 24 4
gpt4 key购买 nike

我在决定重构包含非常相似但不完全相同的 LINQ 查询的方法时遇到了一些问题。

考虑一种方法,它是这样的:

public SomeObject GetTheObject(IMyObject genericObject) {
Type t = genericObject.GetType();
SomeObject so = null;

switch(t.Name) {
case "Type1":
var object1 = (from o in object1s where o.object1id == genericObject.id).FirstOrDefault();
so = (SomeObject)object1;
break;
case "Type2":
var object2 = (from o in object2s where o.object2id == genericObject.id).FirstOrDefault();
so = (SomeObject)object2;
break;
default:
break;
}

return so;
}

这只是一个例子,但假设我需要执行一个不同的查询(不同之处在于它使用不同的 ObjectSet,使用略有不同的字段(object1id 与 object2id)并返回不同的类型。除此之外,查询是相同的。

有没有一种合理的方法来重构这种方法?感觉就像我错过了一些明显的东西。也许我必须使用确切的方法并且我无法避免重写查询,看起来我应该能够以某种方式做到这一点!

非常感谢任何指点

最佳答案

也许您只是过度简化了您的场景,但您函数中令人讨厌的部分是对 SomeObject 的强制转换。难道你不能只使用接口(interface)并(如果需要)在调用站点转换结果吗?例如,您可以让您的 Type1 和 Type2 实现一个公共(public)接口(interface),其中 id1 和 id2 作为 id 公开(或者如果您不控制 Type1 和 Type2,则装饰它们)

public static IMyObject GetTheObject(List<IMyObject> theList,  int id)
{
var ret = (from o in theList
where o.id==id
select o).FirstOrDefault();

return ret;
}

例如,如果您有:

    public interface IMyObject {int id {get;}}

public class Foo : IMyObject {public int id {get; set;}}
public class Bar : IMyObject {public int id {get; set;}}

你可以这样做:

var l1 = new List<IMyObject>(){new Foo(){id=1}, new Foo(){id=2}};
var l2 = new List<IMyObject>(){new Bar(){id=1}, new Bar(){id=2}};

var obj1 = Test.GetTheObject(l1, 1);
var obj2 = Test.GetTheObject(l2, 2);

如果必须的话,在调用函数后转换对象。

编辑:如果您受困于具体对象和强制转换,我能想到的最佳重构是:

public static SomeObject GetTheObject(IMyObject genericObject) {
Type t = genericObject.GetType();

Func<SomeObject, bool> WhereClause = null;
IEnumerable<SomeObject> objs = null; // IEnumerable<T> is covariant,
// so we can assign it both an IEnumerable<object1>
// and an IEnumerable<object2> (provided object1 and 2 are
// subclasses of SomeObject)

switch(t.Name) {
case "Type1":
WhereClause = o => ((Object1)o).object1id == genericObject.id;
objs = object1s;
break;
case "Type2":
WhereClause = o => ((Object2)o).object2id == genericObject.id;
objs = object2s;
break;
}

var ob = objs
.Where(WhereClause)
.FirstOrDefault();

return (SomeObject)ob;
}

关于c# - 包含 LINQ 查询的重构方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8400918/

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