仅使用一种接受不同类型参数的方法

时间:2012-03-29 00:25:08

标签: c# linq-to-sql generics .net-3.5 casting

我有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;
    }

提前致谢。

3 个答案:

答案 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)

您可能想要使用函数重载。此示例使用不同数量的参数,但您可以轻松使用不同的类型。

http://csharp.net-tutorials.com/classes/method-overloading/

答案 2 :(得分:0)

如果两个数据集都是等效的,为什么不只有一个名为ICollection&lt; Product&gt;?的类型?还有一个功能,例如。 “GetProductData(”A“)”,其中“A”/“B”是参数?或者我错过了什么?