我有3个不同的数据库表,它们具有相同的5个字段,但它们没有任何外键关系,因为它们实际上没有保持相同的值,而是等价物;例如:CompanyA表有productA,CompanyB有productB。
所以我有3个不同的集合包括3个等价的字段。所以我想做的是使用一个具有companyType和ProductName属性的类,并且只使用一个方法将这3个不同的集合强制转换为一个类对象,比如ResultClass。
public class ResultClass
{
public EnumCompanyType CompanyType { get; set; }
public string ProductName { get; set; }
public ICollection<ResultClass> ConvertAnything(ICollection<T> collection)
{
//Cast it to ResultClass
return resultClassCollection;
}
}
所以我可以使用它:
ICollection<ProductA> aCollection = GetCompanyAData();
ICollection<ProductB> bCollection = GetCompanyBData();
ConvertAnything(aCollection);
ConvertAnything(bCollection);
我尝试过“动态”,但实际上并不知道原理(既没有知识);所以我搞砸了,我认为这不适合这个。
我试图创建一个扩展方法,但由于扩展没有其参数的类型(因为它使用ICollection),我无法访问项目的字段(例如属性)
我正在使用LinqToSql,所有数据库表术语等都属于这个概念,没有别的。
编辑:
我想我应该清楚自己: 我试图避免的多个实例(或者我不应该继续思考)如下面的
public ICollection<ResultClass> ConvertAnythingForA(ICollection<ProductA> collection)
{
foreach(var item in collection)
{
var result = new ResultClass
{
ProductName = item.ProductA,
ProductType = EnumProductType.ProductA
};
resultClassCollection.Add(result);
}
return resultClassCollection;
}
public ICollection<ResultClass> ConvertAnythingForB(ICollection<ProductB> collection)
{
foreach(var item in collection)
{
var result = new ResultClass
{
ProductName = item.ProductB,
ProductType = EnumProductType.ProductB
};
resultClassCollection.Add(result);
}
return resultClassCollection;
}
提前致谢。
答案 0 :(得分:2)
我可能不完全理解你,但由于ProductA,ProductB等具有相同的签名,你似乎想要一个像
这样的界面public interface IResultClass
{
int CompanyType { get; set; }
string ProductName { get; set; }
}
让这些类只实现接口。您可以使用可能包含各种类型对象的接口集合。如果你需要转换任何方法,它看起来像
public ICollection<IResultClass> ConvertAnything<T>(ICollection<T> collection) where T : IResultClass
{
return collection.Select(x => (IResultClass)x).ToList();
}
评论后 - 我看到你得到的是非通用的ICollection。你尝试过这样的事情吗?
public ICollection<IResultClass> ConvertAnything(ICollection collection)
{
var x = collection.Cast<IResultClass>();
return x.ToList();
}
答案 1 :(得分:0)
您可能想要使用函数重载。此示例使用不同数量的参数,但您可以轻松使用不同的类型。
答案 2 :(得分:0)
如果两个数据集都是等效的,为什么不只有一个名为ICollection&lt; Product&gt;?的类型?还有一个功能,例如。 “GetProductData(”A“)”,其中“A”/“B”是参数?或者我错过了什么?