我想做這樣的事情
public IEnumerable<Foo> Foos { get; private set; }
public IEnumerable<Bar> Bars { get; private set; }
public void Add< T>(T item)
{
if (typeof(T) == typeof(Foo)
Foos.Append<Foo>(item)。
else if (typeof(T) ==typeof(Bar)
Bars.Append<Bar>(item)。
}
我是不是瘋了,或者這有可能嗎?
uj5u.com熱心網友回復:
你可以這樣做:
publicIEnumerable<Foo> Foos { get; private set; }
public IEnumerable<Bar> Bars { get; private set; }
public void Add< T>(T item) where T : class>
{
if (typeof(T) == typeof(Foo)
Foos.Append((T)item)。
else if (typeof(T) == typeof(Bar)
Bars.Append((T)item)。
}
但是這并不是型別安全的,我想這是你的目標。特別是,typeof(T) == typeof(Foo)的檢查基本上被編譯器忽略了。而且,只有當你添加了: class約束時,這才會起作用。否則,你必須先轉換為object。
P.S.: 題外話,IEnumerable<T>沒有append,擴展方法不會修改集合,所以呼叫Append可能毫無意義。
P.P.S.:仔細想想,我想編譯器忽略檢查的說法是不正確的,或者至少要看JIT編譯器的實作。然而,據我所知,JIT 編譯器將只為所有參考型別生成一個實作,因此在運行時執行型別檢查,我的評論仍然有效。
uj5u.com熱心網友回復:
我建議這樣解決:
public ICollection<Foo> Foos { get; private set; }
public ICollection< Bar> Bars { get; private set; }
public void Add< T>(T item) where T : class>
{
if (typeof(T) == typeof(Foo)
Foos.Add(item as Foo)。
if (typeof(T) == typeof(Bar)
Bars.Add(item as Bar)。
}
你可以使用C#串列來處理多個元素。使用方法是這樣的:
using System.Collections.Generic;
Foos = new List<Foo> ();
Bars = new List<Bar>();
var item1 = new Foo();
var item2 = new Foo();
var item3 = new Bar()。
Add(item1);
Add(item2);
Add(item3);
//輸出串列的長度或其內容以檢查結果。
P.S. 如果這些集合和方法仍然是非靜態的,那么首先應該包括創建物件。
uj5u.com熱心網友回復:
要為兩種型別使用兩個單獨的串列,在Add()
public class Bar
{
}
public class Foo {
{
}
public class Storage ?
{
readonly List<Foo> foos;
readonly List<Bar> bars;
public Storage()
{
foos = new List<Foo>()。
bars = new List<Bar>();
}
public IEnumerable<Foo> Foos { get => foos; }
public IEnumerable<Bar> Bars { get => bars; }
public void Add< T>(T item) where T: class>
{
if ( item is Foo foo)
{
foos.Add(foo)。
}
if (item is Bar bar)
{
bars.Add(bar);
}
}
uj5u.com熱心網友回復:
我建議使用一個共同的祖先介面并將資料存盤在一個串列中
public interface IData
{
}
public class Bar : IData ?
{
}
public class Foo : IData ?
{
}
public class Storage {
{
readonly List<IData> Data;
public Storage()?
{
this.Data = new List<IData> ();
}
public IEnumerable<Foo> Foos { get => Data. OfType<Foo>(); }
public IEnumerable<Bar> Bars { get=> Data. OfType<Bar>(); }
public void Add< T>(T item) where T: class, IData。
{
Data.Add(item)。
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/307067.html
標籤:
