我在这里有一个很奇怪的问题要做。由于反思,我将一个类指向我的模拟类而不是“真实”类。(测试目的)。我想知道是否有任何方法可以在模拟中捕获任何方法调用,并根据调用正在等待的内容返回我想要的任何内容。
某一些:
调用另一个对象执行 X() 并期望一个布尔值的对象。
由于我已经通过反射改变了它指向的对象,我希望我的模拟在他调用 X() 时返回“true”(尽管它本身没有实现 X())。
换句话说,不是触发“MethodNotFoundException”,而是接收所有内容并相应地执行一些逻辑。
我在这里有一个很奇怪的问题要做。由于反思,我将一个类指向我的模拟类而不是“真实”类。(测试目的)。我想知道是否有任何方法可以在模拟中捕获任何方法调用,并根据调用正在等待的内容返回我想要的任何内容。
某一些:
调用另一个对象执行 X() 并期望一个布尔值的对象。
由于我已经通过反射改变了它指向的对象,我希望我的模拟在他调用 X() 时返回“true”(尽管它本身没有实现 X())。
换句话说,不是触发“MethodNotFoundException”,而是接收所有内容并相应地执行一些逻辑。
感谢@millimoose,最好的方法(而且很简单)是:
DynamicObject.TryInvoke 方法
http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.tryinvoke.aspx
再次感谢!
您得到的异常可能是MissingMethodException。也许下面的控制台应用程序可以引导您实现更具体的实现,但逻辑应该是相同的:
class Program
{
/// <summary>
/// a dictionary for holding the desired return values
/// </summary>
static Dictionary<string, object> _testReturnValues = new Dictionary<string, object>();
static void Main(string[] args)
{
// adding the test return for method X
_testReturnValues.Add("X", true);
var result = ExecuteMethod(typeof(MyClass), "X");
Console.WriteLine(result);
}
static object ExecuteMethod(Type type, string methodName)
{
try
{
return type.InvokeMember(methodName, BindingFlags.InvokeMethod, null, null, null);
}
catch (MissingMethodException e)
{
// getting the test value if the method is missing
return _testReturnValues[methodName];
}
}
}
class MyClass
{
//public static string X()
//{
// return "Sample return";
//}
}