有没有办法根据泛型类型参数找到接口实现?

时间:2009-11-05 17:52:29

标签: c# generics reflection interface

我有一个数据访问库,它有几个类都实现了相同的接口,它有一个泛型类型参数:

public interface IGetByCommonStringRepository<TEntity>
{
    TEntity GetByCommonStringColumn(string commonString);
}

public class Repository1<Entity1> : IGetByCommonStringRepository<Entity1>
{
    public Entity1 GetByCommonStringColumn(string commonString)
    {
        //do stuff to get the entity
    }
}

public class Repository2<Entity2> : IGetByCommonStringRepository<Entity2>
//...and so on 

我希望有一些方法可以在“helper / utility”类中创建一个静态方法同一个程序集,它将能够识别实例化哪个实现,创建实例并执行<TEntity>方法。有点像...

GetByCommonStringColumn

这样的事情可能吗?

1 个答案:

答案 0 :(得分:1)

该示例仍需要进一步修复..对于每个存储库,它缺少约束。对于每个公共(现在它是无效私有)方法,它也缺少一个功能体。对于该接口方法,它需要一个通用参数。

如果我理解你的话,试试或玩游戏:

public static TEntity clr_bloat_reflected_msdn_method<TEntity>(string commonString) where TEntity : class
        {
            Assembly a = Assembly.GetExecutingAssembly();
            foreach (Type t in a.GetTypes())
                if (!t.IsAbstract && typeof(IGetByCommonStringRepository<TEntity>).IsAssignableFrom(t))
                    return ((IGetByCommonStringRepository<TEntity>)Activator.CreateInstance(t)).GetByCommonStringColumn(commonString);
            return null;
        }

public static TEntity clr_bloat_reflected_msdn_method<TEntity>(string commonString) where TEntity : class { Assembly a = Assembly.GetExecutingAssembly(); foreach (Type t in a.GetTypes()) if (!t.IsAbstract && typeof(IGetByCommonStringRepository<TEntity>).IsAssignableFrom(t)) return ((IGetByCommonStringRepository<TEntity>)Activator.CreateInstance(t)).GetByCommonStringColumn(commonString); return null; }