2013-04-04 169 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