|
分類:[C#]
C# 2017でList<T>から、特定の派生クラス型で特定のプロパティに一致するアイテムのみを抽出するメソッドを作りたいと考えました。
派生クラスが大量に存在するため、調べていたらメソッドに<T>をつけてジェネリックにすれば型が指定出来るというところまでは分かったのですが、下記の箇所で詰まりました。どのように書いたら良いのでしょうか。
またLINQを使えばメソッドを自作しなくても1行で書けたりするのでしょうか。
よろしくお願い致します。
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
public static List<AAA> AllItems = new List<AAA>();
static void Main(string[] args)
{
//テストデータ
AllItems.Add(new AAA("aaa"));
AllItems.Add(new BBB("bbb", 111));
AllItems.Add(new BBB("b", 222));
AllItems.Add(new BBB("bbb", 333));
AllItems.Add(new CCC("ccc", 4.44));
AllItems.Add(new CCC("c", 5.55));
AllItems.Add(new CCC("ccc", 6.66));
//BBBのみを抽出
List<BBB> itemsBBB = GetItems<BBB>("bbb");
//出力
foreach (var item in itemsBBB)
{
Console.WriteLine(item.Name + " : " + item.Num);
}
}
/// <summary>
/// 特定の派生クラス型で特定の名前のアイテムのみを抽出
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public static List<T> GetItems<T>(string name)
{
List<T> list = new List<T>();
foreach (var item in AllItems)
{
if (item is T && item.Name == name)
{
list.Add((T)item); //←ここでキャスト不可のコンパイルエラーとなる。
}
}
return list;
}
}
public class AAA
{
public string Name { get; set; }
public AAA(string name) { this.Name = name; }
}
public class BBB : AAA
{
public int Num { get; set; }
public BBB(string name, int num) : base(name) { this.Num = num; }
}
public class CCC : AAA
{
public double Num { get; set; }
public CCC(string name, double num) : base(name) { this.Num = num; }
}
}
|