在这种情况下,如何构建常用函数和参数化转换?

时间:2009-09-18 05:10:49

标签: c# dynamic casting

这是两组活动:

        //#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 个答案:

答案 0 :(得分:3)

使用通用方法:

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);

如果在执行时间之前你不知道类型,那就变得有点难了 - 你必须用反射来调用方法。如果是这种情况,请告诉我 - 但除非你真的需要,否则你不想这样做。

答案 1 :(得分:0)

如果它们具有通用接口或基本类型,则可以执行以下操作:

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);
    }
}

然后你可以传递一个委托/ lambda表达式:

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