使用两种类型的列表作为参数来调用C#方法



我对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-你可以有两个方法,它们只会在列表的类型上有所不同(由于类型的名称太长,为了简洁起见,我将使用AB,方法名称为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是的选择

另一个想法是创建一个类来保存您需要的所有数据,并从AB对其进行初始化,这样它就知道要提取什么数据,然后在您的方法中使用这些数据:

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)

相关内容

最新更新