我想为一个通用方法创建一个Shim。但我在这种情况下遇到了一些问题。
以下是我的示例:
class BaseRepository <T> where T: Entity
{
public T[] FindAll()
{
return Method<T>.FindAll()
}
}
class ClassA : base<A>
{
}
class A : Entity
{
}
class ClassB : base<B>
{
}
class B : Entity
{
}
现在我想为ClassA和ClassB创建一个ShimMethod。
ShimBaseRepository<A>.AllInstances.FindAll = (repo) => MethodA();
ShimBaseRepository<B>.AllInstances.FindAll = (repo) => MethodB();
public A MethodA()
{
//Make the Same as MethodB
}
public B MethodB()
{
//Make the Same as MethodA
}
但是如果我有超过20个“Base”类怎么办?我不想为每个baseClass创建一个Delegate/方法。我尝试了以下方法:
List<Type> allEntityClasses = (from x in Assembly.GetAssembly(typeof(Entity)).GetTypes()
where !x.IsAbstract && !x.IsInterface
select x).ToList();
foreach(Type type in allEntityClasses=
{
ShimBaseRepository<type????>.AllInstances.FindAll = (repo) => Method();
}
public Entity????? Method()
{
}
在我的单元测试中,我将使用以下方法:
ClassA.FindAll()
ClassB.FindAll()
而不是:
Base.FindAll()
编辑: 我使用 Microsoft Fakes,所以无法更改 ShimClass 中的任何内容。以下为从 Shim 生成的源代码。
public class ShimBaseRepository<T> : ShimBase<BaseRepository<T>> where T : Entity
{
public static class AllInstances
{
public static FakesDelegates.Func<BaseRepository<T>, T[]> FindAll { [ShimMethod("FindAll", 20)] set; }
}
}
我的意图是,我不想为每个实体创建一个委托,我只想遍历所有的EntityClasses并动态地创建委托。但是我不知道如何将我的Type对象添加到中。
ShimBase<T>