2013-07-06 63 views
2

我願做這樣的事情(大大簡化代碼):有點困惑泛型和類型

public class MyClass 
{ 

    private Type _listingType = typeof(AntiqueSellerListing); 

    public DeleteEntity(int id) 
    { 
     // This is what I would like to do, but it does not compile 
     SystemLogic.DeleteItem<this._listingType>(id); 

     // But this does 
     SystemLogic.DeleteItem<AntiqueSellerListing>(id); 
    }  
} 

的DeleteItem方法的定義如下:

public void DeleteItem<T>(int primaryKeyValue) where T : class 

我可能在這裏錯過簡單的東西,但我不知道如何去做我想做的事情。

+0

是否有任何理由爲什麼你需要運行時類型(與通過'typeof'獲得的編譯時類型相反)?如果確實如此,你應該使用多態而不是泛型。 – Douglas

+1

你爲什麼想要做前者而不是後者?看起來你只是想讓DeleteEntity對我來說也是通用的,但在給定的例子中,你正在對事物進行硬編碼,所以很難看出類型將如何變化(假設它會)。 – Chris

+0

也許做一些關於泛型與反射的研究?他們是兩個完全分開的東西。我明白爲什麼可能會出現混亂,但是當你明白了這一點後,你就會明白爲什麼 – MJM

回答

5

該類型必須是編譯時表達式,以便運行時可以生成該方法的代碼。這是因爲運行時無法保證在生成代碼之前定義變量。例如,Ngen工具允許代碼在不運行任何代碼的情況下進行預編譯。

0

這很可能是您想添加一個描述您的「通用」方法的接口。只要類型滿足界面的合約,你會沒事的。

public interface IListing 
{ 
    void DeleteItem(int id); 
} 

public AntiqueSellerListing : IListing 
{ 
    public void DeleteItem(int id) 
    { 
     ... delete logic 
    } 
} 

public class MyClass 
{ 
    public void DeleteEntity<T>(T listing, int id) 
     where T : IListing 
    { 
     SystemLogic.DeleteItem<T>(listing, id); 
    }  
} 

public static class SystemLogic 
{ 
    public void DeleteItem<T>(T listing, int id) 
     where T : IListing 
    { 
     listing.DeleteItem(id); 
    } 
} 

我已經寫下了這個蝙蝠,但一般的想法是在那裏。