C# 在这个场景中,如何构建一个公共函数并参数化转换?

C# 在这个场景中,如何构建一个公共函数并参数化转换?,c#,dynamic,casting,C#,Dynamic,Casting,以下是两组活动: //#1 List<object> AFilterObject = A_List.SelectedList; List<A> AFilters = new List<A>(); foreach (Aitem in AFilterObject ) { //Do activity X } //#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            }
/#1
List AFilterObject=A_List.SelectedList;
列表过滤器=新列表();
foreach(过滤器对象中的Aitem)
{
//做活动X
}
//#2
List BFilterObj=B_List.SelectedList;
List PAYPFILTERS=新列表();
foreach(BFilterObj中的B项)
{
//执行相同的活动X}
正如您所看到的,除了所涉及的类型之外,这两组活动都是常见的。 如何编写具有两个参数(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); 
CommonMethod(列表x,类型y???{//cast x到类型y,然后做一些事情}
//这样我就可以打电话了
常用方法(BFilterObj,B);
//或
通用方法(AFilterObj,A);
使用通用方法:

public void ApplyFilters<T>(List<object> x)
{
   ...
}
public void ApplyFilters(列表x)
{
...
}
您可能需要对T应用一些约束,以便可以在方法中执行所需的操作。例如:

public void ApplyFilters<T>(List<object> x) 
    where T : class. ISomeInterface
{
   ...
}
public void ApplyFilters(列表x)
T:上课。等距接口
{
...
}
然后通过将类型指定为类型参数来调用它:

ApplyFilters(AFilterObj);
ApplyFilters(BFilterObj);
如果直到执行时才知道类型,那么这就有点困难了——您必须使用反射调用该方法。如果是这种情况,请告诉我-但除非你真的必须这样做,否则你不想这样做。

使用一般方法:

public void ApplyFilters<T>(List<object> x)
{
   ...
}
public void ApplyFilters(列表x)
{
...
}
您可能需要对T应用一些约束,以便可以在方法中执行所需的操作。例如:

public void ApplyFilters<T>(List<object> x) 
    where T : class. ISomeInterface
{
   ...
}
public void ApplyFilters(列表x)
T:上课。等距接口
{
...
}
然后通过将类型指定为类型参数来调用它:

ApplyFilters(AFilterObj);
ApplyFilters(BFilterObj);

如果直到执行时才知道类型,那么这就有点困难了——您必须使用反射调用该方法。如果是这种情况,请告诉我-但除非您真的必须这样做,否则您不想这样做。

如果他们有一个公共接口或基类型,您可以这样做:

void DoActivities<TItem>(IList<TItem> filterObject) where TItem : SomeBaseType
{
    foreach (SomeBaseType item in filterObject)
    {
        item.DoActivity(/* ... */);
    }
}
void DoActivities(IList filterObject),其中TItem:SomeBaseType
{
foreach(filterObject中的SomeBaseType项)
{
项目.有效性(/*…*/);
}
}
如果他们没有任何共同点,您可以这样做:

void DoActivities<TItem>(IList<TItem> filterObject, Action<TItem> activity)
{
    foreach (TItem item in filterObject)
    {
        activity(item);
    }
}
void-DoActivities(IList filterObject,Action-activity)
{
foreach(过滤器对象中的项)
{
活动(项目);
}
}
然后可以传递委托/lambda表达式:

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

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

void DoActivities<TItem>(IList<TItem> filterObject) where TItem : SomeBaseType
{
    foreach (SomeBaseType item in filterObject)
    {
        item.DoActivity(/* ... */);
    }
}
void DoActivities(IList filterObject),其中TItem:SomeBaseType
{
foreach(filterObject中的SomeBaseType项)
{
项目.有效性(/*…*/);
}
}
如果他们没有任何共同点,您可以这样做:

void DoActivities<TItem>(IList<TItem> filterObject, Action<TItem> activity)
{
    foreach (TItem item in filterObject)
    {
        activity(item);
    }
}
void-DoActivities(IList filterObject,Action-activity)
{
foreach(过滤器对象中的项)
{
活动(项目);
}
}
然后可以传递委托/lambda表达式:

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

我想知道您如何实现类型之间的关系,例如A和AFilterObj,B和BFilterObj等。这将揭示我们需要考虑的注意事项。我想知道您如何实现类型之间的关系,例如A和AFilterObj,B和BFilterObj,这将揭示我们需要考虑的注意事项。