現在、13個の静的フィールドを持つ静的クラスがあります。各フィールドは静的な読み取り専用リストです。各リストのオブジェクトは異なるクラスですが、13のクラスすべてが同じクラスを拡張します。
コードに繰り返しがあることがわかりました。コードで各リストを13回取得する代わりに、タイプをキーとしてリストを辞書に入れるというアイデアをいじっています。一部の操作を辞書の反復に置き換えることができます。
簡単な実例を用意しましたが、特定のタイプのリストを返すメソッドを取得できません。GetListメソッドにList <T>を返すようにできますか?
public class ListGetter
{
private static Dictionary<Type, List<Iab>> dict = new Dictionary<Type, List<Iab>>();
public static List<Iab> GetList<T>() where T : Iab
{
List<Iab> list = dict[typeof(T)];
return list;
}
}
public interface Iab
{
}
public class ClassA : Iab
{
}
public class ClassB : Iab
{
}
はい、できます。List<T>
代わりに戻るように署名を変更しList<Iab>
、内容をTにキャストする必要があります。
public class ListGetter
{
private static Dictionary<Type, List<Iab>> dict = new Dictionary<Type, List<Iab>>();
static ListGetter()
{
var classAs = new List<Iab>();
for (int i = 0; i < 10; i++)
{
classAs.Add(new ClassA());
}
dict.Add(typeof(ClassA), classAs);
var classBs = new List<Iab>();
for (int i = 0; i < 20; i++)
{
classBs.Add(new ClassB());
}
dict.Add(typeof(ClassB), classBs);
}
public static List<T> GetList<T>() where T : Iab
{
var list = dict[typeof(T)];
return list.Cast<T>().ToList();
}
}
または、IEnumerable拡張メソッドを使用することもできますがOfType<T>
、リストに頻繁にアクセスする場合は遅くなる可能性があります。
public class ListGetter2
{
private static IList<Iab> _list;
static ListGetter2()
{
_list = new List<Iab>();
for (int i = 0; i < 10; i++)
{
_list.Add(new ClassA());
}
for (int i = 0; i < 20; i++)
{
_list.Add(new ClassB());
}
}
public static IList<T> GetList<T>() where T : Iab
{
return _list.OfType<T>().ToList();
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加