我对C#很陌生,我想简化我的代码。我想调用一个包含参数的C#方法。其中一个参数是列表,但我对此有意见。
这是我的代码:
if (condition)
{
List<DonneesFinancieresGn> donneeFinanciereCourante = something;
GestionAbsenceDonneesFinancieres(donneeFinanciereCourante);
}
else
{
List<DonneesFinancieresArchive> donneeFinanciereArchive = something;
GestionAbsenceDonneesFinancieres(donneeFinanciereArchive);
}
以及所谓的方法:
public void GestionAbsenceDonneesFinancieres(var donneeFinanciereList)
{
if (donneeFinanciereList != null && donneeFinanciereList.Any())
{
...
}
}
但我有一个问题,因为donneeFinanciereCourante
是类型List<DonneesFinancieresGn>
,donneeFinanciereArchive
是类型List<DonneesFinancieresArchive>
。
我的问题是:为了考虑这两种类型,我可以在方法GestionAbsenceDonneesFinancieres()
中为参数donneeFinanciereList
使用哪种类型?
编辑
如果我写这样的东西,它会起作用吗?
public void GestionAbsenceDonneesFinancieres<T>(List<T> donneeFinanciereList)
您试图做的事情有几种解决方法,我将根据您的类型如何相互关联来解释它们的优缺点。
1-你可以有两个方法,它们只会在列表的类型上有所不同(由于类型的名称太长,为了简洁起见,我将使用A
和B
,方法名称为Method
,你应该能够毫无问题地替换(:
public void Method(List<A> input)
{
// your code for A specific list
}
public void Method(List<B> input)
{
// your code for B specific list
}
优点:非常简单的设计,无论你的类型如何相互关联,都能正常工作,如果你根据类型有特定的行为,这就是方法
缺点:你可以用这种方式有很多重复的代码
2-按照你的建议使用仿制药:
public void Method<T>(List<T> input)
{
// your code
}
PROS:您的代码将运行:-p
CONS:在编译时,您将不知道列表中的内容,当您只需要对列表执行操作时,这种方法是有用的,并且其中的对象对您来说没有真正的重要性
如果你的类型有一个共同的祖先(或者一个直接继承自另一个(,并且你可以使用那个祖先(或者基类型(,那么你可以约束你的泛型参数,这样你就可以在代码中使用那个祖先,比如:
public class Ancestor
{
public int Age {get; set; }
}
public class A: Ancestor
{
public int Count {get; set;}
}
public class B: Ancestor
{
public int Data { get; set; }
}
/// ....
public void Method<T>(List<T> input) where T: Ancestor
{
// now you can do
input[0].Age; // and the compiler will be happy
// you cannot do
input[0].Count;
input[0].Data;
// even if you are actually working with List<A> or List<B>
}
如果你需要使用每种类型的特定数据,这将是不够的,在这种情况下,第一个解决方案就是使用
如果你的类型没有共同的祖先,那么也许你应该考虑创建一个具有所有共同属性和方法的接口,并让它们都继承自该接口,那么你的方法可以是这样的:
public void Method<T>(List<T> input) where T: IMyInterface
PROS:你应该有最小的代码重复
CONS:你的方法可能会有点不一致,因为它可以这样调用:
var myList = new List<IMyInterface> { new A(), new B() };
Method(myList);
或者,在共同继承人的情况下:
var myList = new List<Ancestor> { new A(), new B() };
Method(myList);
这可能是你不想要的。此外,如果你需要关于你的类型的特定数据,同样,1是的选择
另一个想法是创建一个类来保存您需要的所有数据,并从A
和B
对其进行初始化,这样它就知道要提取什么数据,然后在您的方法中使用这些数据:
public class CommonDataObject
{
public CommonDataObject(A input){...}
public CommonDataObject(B input){...}
}
public void Method(List<CommonDataObject> input){...}
// and to call your method given a list of A or B
var myList = myListOfAorB.Select(x => new CommonDataObject(x));
Method(myList);
优点:您将避免原始列表中的代码重复和副作用,尽管由于您的方法无效,这些副作用似乎正是您的目标
缺点:这需要做更多的工作,如果Method
根据类型的不同表现得太不同,则可能根本不可能,在这种情况下,第一个解决方案可能是最好的
必须是中返回的类型
DonneesFinancieresRepository.LireDonneesFinancieresBase(idArchive)