c# - 新しいコピーを作成せずにリストをリストにキャストする
質問する
645 次
4 に答える
2
次のようなことを試すことができます:
public abstract class Foo<T>
{
List<T> _List = new List<T>();
public List<T> ListObject { get { return _List; } }
}
public class Bar : Foo<string>
{
public List<string> ListString
{
get { return ListObject; }
}
}
結果:
于 2013-03-24T22:56:43.320 に答える
2
他の誰かがこれに対する合理的な答えを思いつくことを望んでいましたが、現実には、おそらくこれに対する良い答えはありません.
ただし、平均的な猫の皮を剥ぐ方法はいくつかありますが、その多くはかなり醜いものです。
この問題に対する厄介な解決策の 1 つは、nList<object>
オブジェクトをカプセル化し、選択した任意の型としてオブジェクトにアクセスしようとするリスト クラスを実装することです。このタイプのプロキシ クラスは、正しく行うのが難しい場合がありますが、目的を達成する方法になる可能性があります。
public class StringObjectList : IList<string>
{
private List<object> _list;
public StringObjectList(List<object> src)
{
_list = src;
}
// IList Implementation...
public string this[int index]
{
get
{
object obj = _list[index];
if (obj == null)
return null;
return obj.ToString();
}
set
{
_list[index] = value;
}
}
// ... plus 3 more IList<string> methods (IndexOf, Insert, RemoveAt)
// ICollection<string> implementation (5 methods, 2 properties)
// IEnumerable<string> implementation (1 method)
// IEnumerable implementation (1 method)
}
実装の詳細のいくつかは少しトリッキーです。基本的なリストは文字列やその他のオブジェクトを喜んで受け入れるため、ほとんどの場合、実装は単純なプロキシ メソッドです。たとえば、ICollection<string>.Add
メソッドは次のように簡単です。
public void Add(string item)
{
_list.Add(item);
}
問題が発生する可能性があるのはIEnumerable<string>
とのIEnumerable
実装で、サポートするクラスをいくつか作成する必要がある場合があります。
シンプルでもエレガントでもありませんが、潜在的に実行可能です。
于 2013-03-27T03:09:35.797 に答える
0
public abstract class Foo<T>
{
public abstract IList<T> MyList { get; }
// you can manipulate MyList in this class even if it is defined in inherited class
}
public class Bar : Foo<string>
{
private readonly IList<string> _myList = new List<string>();
public override IList<string> MyList
{
get { return _myList; }
}
}
[TestFixture]
public class TestFixture1
{
[Test]
public void Test()
{
Bar oBar = new Bar();
Foo<string> oFoo = oBar;
oFoo.MyList.Add("Item");
// oFoo.ListObject= { "Item" }
// oBar.ListString = { "Item" }
oBar.MyList.Add("NewItem");
// oFoo.ListObject= { "Item" }
// oBar.ListString = { "Item" }
}
}
于 2013-03-24T23:22:51.960 に答える
0
上記の一般的な解決策が気に入らない場合は、List
メンバーを抽象化できます。
public abstract class Foo
{
public abstract IList ListObject { get; }
}
public class Bar : Foo
{
public override IList ListObject
{
get { return new List<string>(); }
}
}
于 2013-03-24T23:04:37.753 に答える