Я хочу создать Shim для универсального метода. Но в этом случае у меня есть немного проблем с Generic.ШИМ и общие методы
Вот мой пример:
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
{
}
теперь я хочу, чтобы создать ShimMethod для ClassA и ClassB
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"? Я не хочу создавать делегат/метод для каждого базового класса. Я пытался что-то вроде этого:
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()
{
}
В моей UnitTest я буду использовать следующие методы:
ClassA.FindAll()
ClassB.FindAll()
, а не:
Base.FindAll()
Edit: Я использую Microsoft Фальшивок, поэтому я ничего не может изменить в 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>
В чем проблема, которую вы пытаетесь решить? Вы показываете нам решение, которое не работает, но не проблема, которую вы на самом деле имеете. Кроме того, убедитесь, что у вас есть пример кода, который можно запустить. – Luaan