Используйте только один метод, который принимает разные типизированные параметры - PullRequest
0 голосов
/ 29 марта 2012

У меня есть 3 разные таблицы базы данных, которые имеют одинаковые 5 полей, но у них нет никакого отношения внешнего ключа, поскольку они не сохраняют одно и то же значение на самом деле, но эквивалентны;Например: в таблице CompanyA есть productA, а в CompanyB - productB.

, поэтому у меня есть 3 разные коллекции, включающие 3 поля, которые эквивалентны.Поэтому я хотел бы использовать один класс со свойствами companyType и ProductName и использовать только один метод для приведения этих трех разных коллекций к одному-единственному объекту класса, скажем, 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 и все термины таблицы базы данных и т. д. относится к этой концепции, ничего больше.

edit:

Думаю, я должен прояснить ситуацию: многочисленные случаи, которых я стараюсь избегать (или я не должен все еще думать), как ниже

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 ]

2 голосов
/ 29 марта 2012

Возможно, я вас не совсем понимаю, но поскольку ProductA, ProductB и т. Д. Имеют одинаковую подпись, кажется, что вам нужен интерфейс, подобный

public interface IResultClass
{
    int CompanyType { get; set; }
    string ProductName { get; set; }
}

И эти классы просто реализуют интерфейс. Вы можете работать с коллекциями интерфейса, которые могут иметь объекты различных типов. Если вам нужен метод convert что-нибудь, он будет выглядеть как

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();
    }
0 голосов
/ 29 марта 2012

Если оба набора данных эквивалентны, почему бы не иметь один тип, называемый ICollection ? И одна функция, например. «GetProductData (« A »)», где «A» / «B» - это параметр? Или я что-то упустил?

0 голосов
/ 29 марта 2012

Возможно, вы захотите использовать функцию перегрузки. В этом примере используется различное количество параметров, но вы могли бы также легко использовать разные типы.

http://csharp.net -tutorials.com / классы / метод-перегрузка /

...