- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想为通用方法创建一个垫片。但在那种情况下,我对 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
{
}
现在我想为 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 个“基础”类怎么办?我不想为每个基类创建委托(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; }
}
}
我的意图是,我不想为每个实体创建委托(delegate),我只想遍历所有 EntityClass 并动态创建委托(delegate)。但是我不知道如何在
ShimBase<T>
最佳答案
好吧,让我们稍微讨论一下。首先,这是一个使用虚方法的直接解决方案:
public class Base<T> where T : Entity
{
public virtual T[] FindAll()
{
return null;
}
}
然后重写FindAll
在具体类(class)中或者,如果可以的话,制作 Base
摘要和InnerFindAll
也很抽象。
但是,如果您需要在运行时指定委托(delegate)(我可以看到您有一个特定的 Helper,但我不明白,为什么您在 Base 中调用 helper,然后您有一些未定义的问题 AllInstances 带有Func) 这种方法无济于事。您需要实现 Strategy pattern在 Base 中分配了一些默认策略。那么你将有 3 种方法来“解决”具体类中的策略:
T
)此外,我认为您在设计方面存在一些问题。我看不出有任何理由需要将 FindAll 实现为注入(inject) Func<T>
类型静态属性的 lambda (是的,我认为您可以将 AllInstances.FindAll
替换为 static FindAll
)。所以如果我是你,我会使用抽象方法..
编辑
现在我遇到了你的问题,只能通过反射给你一个相当丑陋的解决方案......我不建议你使用它,因为它真的很严格
public class Program
{
static void Main(string[] args)
{
List<Type> allEntityClasses = (from x in Assembly.GetAssembly(typeof(Entity))
.GetTypes().Where(t=>typeof(Entity).IsAssignableFrom(t))
where !x.IsAbstract && !x.IsInterface
select x).ToList();
foreach (var type in allEntityClasses)
{
var genericType = typeof(BaseGeneric<>).MakeGenericType(type);
var helper = new DelegateHelper();
var myLambda = helper.GetLambdaForType(type);
var allInst = genericType.GetProperty("AllInstances").GetValue(null);
if (allInst == null)
{
allInst = Activator.CreateInstance(genericType.GetProperty("AllInstances").PropertyType);
}
allInst.GetType().GetProperty("FindAll").SetValue(allInst,myLambda);
}
}
}
public static class BaseGeneric<T>
{
public static AllInstances<T> AllInstances { get; set; }
}
public class AllInstances<T>
{
public Func<T[]> FindAll { get; set; }
}
public class DelegateHelper
{
public Delegate GetLambdaForType(Type type)
{
var funcType = typeof(Func<>).MakeGenericType(type.MakeArrayType());
var methodInfo = typeof(DelegateHelper).GetMethods().FirstOrDefault(t => t.Name == "FunctionMethod")
.MakeGenericMethod(type);
var @delegate = methodInfo.CreateDelegate(funcType, this);
return @delegate;
}
public T[] FunctionMethod<T>()
{
return new T[10];
}
}
public class Entity
{
}
public class EntityFirst
{
}
public class EntitySecond
{
}
关于c# - Shim 和通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29093896/
我正在尝试使用更新的包重建项目但遇到此错误: [folatt@ArkOS-Dev genesis]$ ember build cleaning up... Build failed. The Broc
我正在尝试使用更新的包重建项目但遇到此错误: [folatt@ArkOS-Dev genesis]$ ember build cleaning up... Build failed. The Broc
鉴于以下情况: main.js var angular = require('angular'); 包.json { "main": "./main.js", "browser": {
我正在编写将一些数据放入分类帐的链码,然后尝试使用shim.GetStateByPartialCompositeKey()将其列出,并从迭代器中获取数据列表。现在,我想根据时间戳对数据进行排序(仅按日
我想为通用方法创建一个垫片。但在那种情况下,我对 Generic 有点麻烦。 这是我的例子: class BaseRepository where T: Entity { public T[
如主题所示。我的文件结构是: js/ |- bootstrap | |- module1 | |- module2 | |- jquery.min.js |- main.js 我的
该术语的官方解释是 es5-shim.js and es5-shim.min.js monkey-patch a JavaScript context to contain all EcmaScrip
它has been stated那: The shim allows for daemonless containers. It basically sits as the parent of the
据我了解,您可以使用 Requirejs 的填充程序来动态加载未在自己的文件中定义为模块的脚本。那么为什么我不能让这样一个简单的脚本工作呢? 这是我的非工作示例: /libs/test.js: var
我想将 bootstrap.js 和 jquery.js(均随 npm 安装)合并到vendors.js 文件中,但仍然可以通过调用 require('$') 来使用 jquery。所以我创建了 gu
我正在尝试获取与 magento 2 requirejs 一起使用的常量联系人脚本。 (我尝试将其内联添加,但它会发生冲突并导致错误) 他们的脚本需要数组 localizedErrMap 和 jQue
我发现自己需要这样的东西: // This could just as well be a concrete class. // // It is an interface for the sake
我正在尝试将现有应用程序分解为多个模块。我选择使用 Browserify 来做到这一点,因为它的语法很好地模仿了 NodeJS 的要求。 我的项目依赖于几个外部模块,其中之一是 Backbone。因此
我想将两个变量($ 和 jQuery)从 jquery 包传递到 persian-datepicker。因此,我添加了 $ 和 jQuery 作为 persian-datepicker 的依赖项。我所
我在 browserify-shim 和 bootstrap-datetimepicker 方面遇到问题。 Bootstrap-datetimepicker 需要 moment.js 但必须先加载此插
我想针对某些错误的网络行为测试存储库。我使用 MS Fakes 伪造了类(class),它看起来像这样: ShimInputRepository .AllInstanc
我在 vs 2015 上运行 angularjs2/TypeScript 项目 并按照 https://www.typescriptlang.org/docs/handbook/asp-net-4.h
我有一个测试方法,当我运行它时它很好,但在调试时失败并出现异常。下面是经过测试的方法和 VS Test Runner 的输出。异常来自 ShimsContext.Create() 信息:VS 2012
在为 BCL(或与此相关的任何库)中的类型成员创建垫片时。我们经常遇到这样一种情况,我们想要调用我们已经覆盖的原始方法(无论是在 shim 委托(delegate)内部还是外部)。例如: System
在 Visual Studio 2015 中,我有一个测试项目,我向其中添加了一个假程序集。 在单元测试本身中,我为静态泛型方法创建了一个垫片,该方法将实例返回到泛型类型,例如: using (Shi
我是一名优秀的程序员,十分优秀!