В этом сценарии, как создать общую функцию и параметризовать приведение? - PullRequest
0 голосов
/ 18 сентября 2009

Это 2 вида деятельности:

        //#1
        List<object> AFilterObject = A_List.SelectedList;
        List<A> AFilters = new List<A>();
        foreach (Aitem in AFilterObject )
        {
            //Do activity X
        }
        //#2
        List<object> BFilterObj = B_List.SelectedList;
        List<B> payopFilters = new List<B>();
        foreach (B item in BFilterObj )
        {
            //Do same activity X            }

Как вы можете видеть, оба набора действий являются общими, за исключением соответствующего типа. Как я могу написать метод с 2 параметрами - filterObject, Type - чтобы я мог использовать этот метод обычным способом?

Чтобы прояснить ситуацию, конечная цель:

CommonMethod(List<object> x, Type y???) { //cast x to type y then do some stuff }

//so that I can call
CommonMethod(BFilterObj ,B); 
//or
CommonMethod(AFilterObj ,A); 

Ответы [ 2 ]

3 голосов
/ 18 сентября 2009

Используйте общий метод:

public void ApplyFilters<T>(List<object> x)
{
   ...
}

Возможно, вам придется применить некоторые ограничения к T, чтобы вы могли делать то, что вам нужно в методе. Например:

public void ApplyFilters<T>(List<object> x) 
    where T : class. ISomeInterface
{
   ...
}

Затем вы бы вызвали его, указав тип в качестве аргумента типа :

ApplyFilters<A>(AFilterObj);
ApplyFilters<B>(BFilterObj);

Если вы не знаете тип до времени выполнения, это становится несколько сложнее - вы должны вызывать метод с отражением. Дайте мне знать, если это так, но вы не хотите этого делать, если вам действительно не нужно.

0 голосов
/ 18 сентября 2009

Если у них общий интерфейс или базовый тип, вы можете сделать это:

void DoActivities<TItem>(IList<TItem> filterObject) where TItem : SomeBaseType
{
    foreach (SomeBaseType item in filterObject)
    {
        item.DoActivity(/* ... */);
    }
}

Если у них нет ничего общего, вы можете сделать это:

void DoActivities<TItem>(IList<TItem> filterObject, Action<TItem> activity)
{
    foreach (TItem item in filterObject)
    {
        activity(item);
    }
}

Тогда вы можете передать делегат / лямбда-выражение:

List<SomeClass> items = new List<SomeClass>();
// ...
DoActivities(items, (item) => item.SomeClassMethod(/* ... */));
...