1、源码:
public static IEnumerable<TResult> OfType<TResult>(this IEnumerable source) {
if (source == null) throw Error.ArgumentNull("source");
return OfTypeIterator<TResult>(source);
}
static IEnumerable<TResult> OfTypeIterator<TResult>(IEnumerable source) {
foreach (object obj in source) {
if (obj is TResult) yield return (TResult)obj;
}
}
从源码可以看出,在原列表中经过筛选返回指定类型的目标列表
2、如下例子:
List<object> list = new List<object>();
list.Add(1);
list.Add(2);
list.Add(3);
list.Add("4");
list.Add("5");
list.Add(6);
var strList = list.OfType<string>();
最后得到 “4”, “5”的字符列表
父子类的区分也可用这种方法
[AttributeUsage(AttributeTargets.Constructor)]
public class TestAttribute : Attribute { }
public abstract class BaseInfo
{
[Test]
public BaseInfo() { }
public abstract string GetName();
}
var constructors= typeof(BaseInfo).GetConstructors();
var constructor= constructors.FirstOrDefault(it =>
it.GetCustomAttributes(false).OfType<TestAttribute>().Any());
筛选构造方法携带Test特性的