Тот же метод, который принимает другой тип параметра? - PullRequest
0 голосов
/ 13 октября 2009

Я знаю, что есть очень похожие вопросы, но я не уверен, что какой-то из них - именно то, что мне нужно. У меня есть 2 метода, которые делают одно и то же (поэтому мне не нужно переопределять или что-то еще), единственное отличие - это тип параметра и возвращаемый тип.

public List<List<TestResult>> BatchResultsList(List<TestResult> objectList)
    {

    }

public List<List<ResultLinks>> BatchResultsList(List<ResultLinks> objectList)
    {

    }

Есть ли удобный способ сделать это, не задействуя дублирующий код (типы используются внутри метода).

Ответы [ 4 ]

6 голосов
/ 13 октября 2009
public List<List<T>> BatchResultsList<T>(List<T> objectList)
{
    foreach(T t in objectList)
    {
        // do something with T.
        // note that since the type of T isn't constrained, the compiler can't 
        // tell what properties and methods it has, so you can't do much with it
        // except add it to a collection or compare it to another object.
    }
}

и если вам нужно ограничить тип T так, чтобы вы обрабатывали только определенные типы объектов, заставьте TestResult и ResultLinks реализовать интерфейс, скажем, IResult. Тогда:

public interface IResult 
{
    void DoSomething();
}

public class TestResult : IResult { ... }

public class ResultLinks : IResult { ... }

public List<List<T>> BatchResultsList<T>(List<T> objectList) where T : IResult
{
    foreach(T t in objectList)
    {
        t.DoSomething();
        // do something with T.
        // note that since the type of T is constrained to types that implement 
        // IResult, you can access all properties and methods defined in IResult 
        // on the object t here
    }
}

Когда вы вызываете метод, вы, конечно, можете опустить параметр типа, так как он может быть выведен:

List<TestResult> objectList = new List<TestResult>();
List<List<TestResult>> list = BatchResultsList(objectList);
2 голосов
/ 13 октября 2009

использование универсальные методы

public List<List<T>> BatchResultsList<T>(List<T> objectList)
{

}

когда вы вызываете его для TestResult:

BatchResultsList<TestResult>(testResultList)

для ResultLinks:

BatchResultsList<ResultLinks>(resultLinksList)

EDIT:

Я полагаю, что поскольку в двух ваших методах используется один и тот же код, TestResult и ResultLinks должны реализовывать общий интерфейс, назовем его SomeInterface и общий конструктор, давайте выберем один без параметров:

вы бы объявили и использовали метод следующим образом:

    public List<List<T>> BatchResultsList<T>(List<T> objectList) 
     where T:SomeInterface, new()
    {
        List<List<T>> toReturn = new List<List<T>>();

        //to instantiate a new T:
        T t = new T();

        foreach (T result in objectList)
        {
            //use result like a SomeInterface instance
        }
        //...
        return toReturn;
    }
1 голос
/ 13 октября 2009

а как же

public List<IList> BatchResultsList(List<IList> objectList)
{
}
0 голосов
/ 13 октября 2009

Общая версия:

public List<List<T>> BatchResultsList<T>(List<T> objectList){}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...