是否可以通过Reflection编写以下代码?
var fake = A.Fake<Foo>(
o => o.WithArgumentsForConstructor(new[] { "Hello" }));
o在哪里:
Action<IFakeOptionsBuilder<T>>
其中WithArgumentsForConstructor是:
IFakeOptionsBuilder<T> WithArgumentsForConstructor(IEnumerable<object> argumentsForConstructor);
Foo类是:
class Foo
{
public Foo(string s)
{
}
}
我所做的是:
object fake = typeof(A)
.GetMethod("Fake", new Type[] { })
.MakeGenericMethod(new[] { this.targetType })
.Invoke(null, /* Here I need to pass the lambda. */);
最佳答案
是的,可以通过反思来做您建议的事情,但是完全没有必要。像这样自己定义一个静态方法会更简单:
public static class MyClass
{
public static T CreateFakeWithArgumentsForConstructor<T>(object[] argumentsForConstructor)
{
return A.Fake<T>(x => x.WithArgumentsForConstructor(argumentsForConstructor));
}
}
现在,只需使用反射调用此函数:
var method = typeof(MyClass).GetMethod("CreateFakeWithArgumentsForConstructor", BindingFlags.Public | BindingFlags.Static).MakeGenericMethod(new[] { theType });
method.Invoke(null, argumentsForConstructor);