Tôi đang cố gắng đưa ra một triển khai cho NotOfType
, có cú pháp cuộc gọi có thể đọc được. NotOfType
nên là bổ sung cho OfType<T>
và do đó sẽ mang lại tất cả các yếu tố đó là không loại T
Làm cách nào để triển khai NotOfType <T> trong LINQ có cú pháp gọi điện đẹp mắt?
Mục tiêu của tôi là để thực hiện một phương pháp mà sẽ được gọi là giống như OfType<T>
, giống như trong dòng cuối cùng của đoạn này:
public abstract class Animal {}
public class Monkey : Animal {}
public class Giraffe : Animal {}
public class Lion : Animal {}
var monkey = new Monkey();
var giraffe = new Giraffe();
var lion = new Lion();
IEnumerable<Animal> animals = new Animal[] { monkey, giraffe, lion };
IEnumerable<Animal> fewerAnimals = animals.NotOfType<Giraffe>();
Tuy nhiên, tôi không thể đưa ra triển khai hỗ trợ cú pháp gọi cụ thể đó.
Đây là những gì tôi đã cố gắng cho đến nay:
public static class EnumerableExtensions
{
public static IEnumerable<T> NotOfType<T>(this IEnumerable<T> sequence, Type type)
{
return sequence.Where(x => x.GetType() != type);
}
public static IEnumerable<T> NotOfType<T, TExclude>(this IEnumerable<T> sequence)
{
return sequence.Where(x => !(x is TExclude));
}
}
Gọi các phương pháp này sẽ trông như thế này:
// Animal is inferred
IEnumerable<Animal> fewerAnimals = animals.NotOfType(typeof(Giraffe));
và
// Not all types could be inferred, so I have to state all types explicitly
IEnumerable<Animal> fewerAnimals = animals.NotOfType<Animal, Giraffe>();
Tôi nghĩ rằng có rất lớn những hạn chế với phong cách của cả hai cuộc gọi này. Việc đầu tiên bị một dự phòng "loại/loại" xây dựng, và thứ hai chỉ là không có ý nghĩa (tôi muốn có một danh sách các loài động vật không phải là động vật cũng không Giraffes?).
Vì vậy, có cách nào để thực hiện những gì tôi muốn không? Nếu không, nó có thể được có thể trong các phiên bản tương lai của ngôn ngữ? (Tôi nghĩ rằng có thể một ngày nào đó chúng ta sẽ đặt tên đối số kiểu, hoặc rằng chúng ta chỉ cần cung cấp một cách rõ ràng các đối số kiểu không thể suy ra được?)
Hoặc tôi chỉ là ngớ ngẩn?
Tôi chỉ viết framework/chia sẻ mã như thế này nếu tôi cảm thấy nó sẽ có được một lượng tái sử dụng hợp lý. Bao lâu thì bạn cần một phương pháp như thế này, và nó có biện minh cho chi phí (thời gian dành cho việc suy nghĩ về những khó khăn về thiết kế) không? –
Hai phiên bản của bạn làm những việc khác nhau đáng kể. – SLaks
@SLaks: Xây dựng, vui lòng. –