带有泛型的类型类

时间:2013-04-04 12:39:14

标签: c# .net generics

我有这样的方法:

public static void Map<TEntityTrack>() 

其中TEntityTrack是以下的实现:

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

Map方法中,我怎么知道TEntityTrack的TEntity类类型? 我不想在Map中指定TEntity,因为我想映射我的实现,如:

TrackMap.Map<MyImplOfTrackByEntity>();

有可能吗?

3 个答案:

答案 0 :(得分:5)

您应该在Map方法上添加第二个类型参数以及相应的type constraint

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

答案 1 :(得分: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.");

答案 2 :(得分:-1)

如果我理解正确,您可以使用以下语句获取泛型参数的类型:

Type param = typeof(TEntity);