解決一個泛型轉換的問題

來源:互聯網
上載者:User
這個問題本來發在社區裡面,整理一下備以後參考.

public class TestClass : ITestInterface
    {
        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    
    }
    public interface ITestInterface
    {
        string Name { get; set;}
    }

為什麼這樣寫就不行呢?

            IList<ITestInterface> list = (IList<ITestInterface>)new List<TestClass>();
            Assert.IsTrue(list != null);

我想使用實現相同介面的不同類型的集合類型, 這些類型又沒有實現此介面的公用基類.

己想了一個解, 請大家看看吧.思想跟Klesh Wong的類似.

List<ClassA> listA = new List<ClassA>();
for (int i = 0; i < 10; i++)
{
ClassA a = new ClassA();
listA.Add(a);
}

List<ClassB> listB = new List<ClassB>();
for (int k = 0; k < 10; k++)
{
ClassB b = new ClassB();
listB.Add(b);
}
List<IMyInterface> listInterfaceA = listA.ConvertAll(new
Converter<ClassA,IMyInterface>(ConterMyGenericClassA));
Assert.IsTrue(listInterfaceA.Count > 5);

List<IMyInterface> listInterfaceB = listB.ConvertAll(new
Converter<ClassB, IMyInterface>(ConterMyGenericClassB));
Assert.IsTrue(listInterfaceB.Count > 5);
}
public static IMyInterface ConterMyGenericClassA(ClassA obj)
{
return (IMyInterface)obj;
}

public static IMyInterface ConterMyGenericClassB(ClassB obj)
{
return (IMyInterface)obj;
}


什麼會有這種需求呢, 其實是這樣. 通常我們會做一些控制項,在裡面公開一些資料來源的屬性,比如 IList<ClassA>,
而這裡的資料我們有時候會去視圖裡面取出來,
如果採用把視圖映射成對象的話我們就不能直接把這個源給到控制項,當然,也並非不行,比如不使用泛型,就弄個ArrayList也行,但是俺們不是追求完美
嘛~~所以這個時候自然就想到抽象一個介面出來使這個控制項的資料來源不依賴於某個類型,這樣我們在做資料訪問的時候就省事多了,特別是使用了ORM組件的時
候.

再來個泛型加匿名代理的版本,一行就搞定了;)

List<IMyInterface> listE
= listB.ConvertAll<IMyInterface>(new Converter<ClassB,
IMyInterface>(delegate(ClassB b) { return (IMyInterface)b; }));
Assert.IsTrue(listE.Count > 0);


應該是這樣寫才比較靠譜:
IList<ITestInterface> list = new List<ITestInterface>();
在類型轉換的時候,介面轉換隻針對實現介面的類型
而(IList<ITestInterface>)右側的List<T>僅僅
[SerializableAttribute]
public class List<T> : IList<T>, ICollection<T>,
IEnumerable<T>, IList, ICollection, IEnumerable
而這裡的T是強型別判斷的,此時的T在編譯時間就已經被指定為TestClass,因此這裡不存在一個類型轉換的過程。
因此頂多隻能(IList<TestClass>)new List<TestClass>();
而非(IList<ITestInterface>)new List<TestClass>();




1小時前   Klesh Wong :
理論上來,
IList<ITestInterface> list = (IList<ITestInterface>)new List<TestClass>();
這種寫法應該是成立的才對,但確實又不能通過編譯。
樓主的需求應該也有一定的合理性,暫時只能想出使用重新構建List的方法來做轉換,不知各們有沒有更好的解決方案?
IList<ITestInterface> list = Cast<TestClass, ITestInterface>(new List<TestClass>());
Response.Write(list != null);
public static IList<T> Cast<S, T>(IList<S> e) where S:T
{
IList<T> list = new List<T>();
foreach (S s in e)
list.Add(s);
return list;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.