如何检查C#泛型类型是否为集合(IEnumerable)?

时间:2016-08-12 07:26:15

标签: c# linq generics

我正在尝试使用通用参数创建方法:

public class MyActivity extends FragmentActivity {

    private BoilerPlate boilerPlate;

    //...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_example);

        boilerPlate = new BoilerPlate(this);
    }

    //...

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, String[] grantResults) {
        super(requestCode, permissions, grantResults);
        boilerPlate.getResults(requestCode, permissions, grantResults);
    }
}

如您所见,第一个方法接受并返回一个集合,并简单地为集合中的每个元素调用第二个方法(具有相同的名称但签名不同)。

我想创建一个处理这两种情况的通用方法。如果集合通过,它应该调用自己。为此,我需要检查类型是否为public class BoilerPlate { private MyActivity mActivity; BoilerPlate(MyActivity activity){ this.mActivity = activity; // do something with activity. } public void getResults(int requestCode, String[] permissions, String[] grantResults) { // do anything with request, permissions, grantResults. } } ,但行public List<DTListItem> MapDTListResponse(List<App.Order.DT> dtList) { return dtList.Select(MapDTListResponse).ToList(); } public DTListItem MapDTListResponse(App.Order.DT dt) { return RecMap<DTListItem, App.Order.DT>(dt); } private T RecMap<T,TU>(TU newObject) { if (TU is IEnumerable) // this doesn't work; what do i check for here { //Also, how do i get this bit to replicate MapDTListReponse newObject.Select(RecMap).ToList(); } else { return Mapper.Map<T>(newObject); } } 出现以下错误

  

TU是在给定上下文中无效的类型。

此外,IEnumerable出现以下错误

  

TU不包含Select

的定义

1 个答案:

答案 0 :(得分:1)

is运算符在其左侧采用对象实例,因此不能像这样使用它。相反,你可以这样做:

if (newObject is IEnumerable) // ...

由于您希望稍后将该实例用作集合,因此您可以使用as运算符:

var newCollection = newObject as IEnumerable<T>;
if (newCollection != null) // ...

值得指出的是,在你拥有的只是一个类型(而不是实例)的情况下,你可以通过IsAssignableFrom类的Type方法实现同样的目的,如下所示: / p>

public static bool IsSequence<T>() => typeof(IEnumerable).IsAssignableFrom(typeof(T));