我正在尝试使用通用参数创建方法:
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
的定义
答案 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));