2013-04-04 170 views
1

我有這樣的方法:泛型類型類

public static void Map<TEntityTrack>() 

其中TEntityTrack是一個實現:

public abstract class EntityTrack<TEntity> : EntityTrack, IChangeTrackingService<TEntity> 

裏面的Map方法,我怎麼能知道TEntity類類型的TEntityTrack? 我想在地圖未指定TEntity,因爲我想我實現映射,如:

TrackMap.Map<MyImplOfTrackByEntity>(); 

這可能嗎?

Type param = typeof(TEntity); 

回答

0

如果你想在運行時,你可以做以下類型:

Type[] genericTypes = typeof(TEntityTrack).GetGenericArguments(); 
Type entityType = genericTypes[0]; 

當然,加入所有適當的邊界檢查等。

編輯:爲了找到基類型的泛型參數。

Type type = typeof(TEntityTrack); 
while (type != typeof(object)) 
{ 
    Type[] genericTypes = type.GetGenericArguments(); 
    if (genericTypes.Length == 0) 
    { 
     type = type.BaseType; 
    } 
    else 
    { 
     Type entityType = genericTypes[0]; 
     return entityType; 
    } 
} 
// Throw an exception or other appropriate action 
throw Exception("Does not have generic argument."); 
+0

typeof(TEntityTrack).GetGenericArguments()不返回任何類型..任何想法? – margabit 2013-04-04 13:02:39

+0

您是否傳入了從泛型類派生的類,但指定了泛型?在這種情況下,您可能必須遍歷繼承鏈,直到達到泛型類型。 – 2013-04-04 13:12:25

+0

好的。我會盡力。謝謝 – margabit 2013-04-04 13:13:19

-1

如果我理解正確的話,你可以使用下面的語句獲取泛型參數的類型

public static void Map<TEntityTrack, TEntity>() 
    where TEntityTrack : EntityTrack<TEntity> 
{ 
    var entityType = typeof(TEntity); 
} 
+1

-1他想知道'TEntity'的類型。請仔細閱讀該問題。 – 2013-04-04 12:43:24

5

你應該在你的Map方法用適當的type constraint添加第二個類型參數,沿:

+0

你更快=) – 2013-04-04 12:46:35

+0

我之前得到了這個。但是如果我使用這種方法,我必須在Map中指定TEntity,這是我不想要的。 – margabit 2013-04-04 12:48:18

+0

儘可能地討厭'var'。它只支持LINQ。它使作者的生活更輕鬆,讀者也更難。 – dotNET 2013-04-04 12:49:03