我想解决什么问题?通过反射,我想执行代码(运行实例方法和静态方法),其中我事先不知道如何定义要运行的方法。
假设我有一个MethodInfo想要调用的。我不知道它有什么参数,所以我做了以下操作。
首先,我检查方法参数是否有效(如果无效,则不会调用方法):
private static IEnumerable<Type> GetValidMethodTypes()
{
var validTypes = new List<Type>();
validTypes.AddRange(new[]
{
typeof (SByte),
typeof(String[]),
//etc...
});
return validTypes;
}
Run Code Online (Sandbox Code Playgroud)
然后我根据参数类型生成随机值:
public object RandomizeParamValue(string typeName)
{
switch (typeName)
{
case "SByte":
{
//return randomized value
}
case "String[]":
{
//return randomized value
}
//etc...
}
}
Run Code Online (Sandbox Code Playgroud)
例如,String[] 的随机值将为 ["a","ab", "ccc"] 或 ["aa", "b"]。公式为:new string[random size between 1 and 5],其中包含随机长度的随机字符串。一切都超级随机:)
问题是这仅适用于我的代码中支持的类型。我当然可以添加对更多类型的支持,但这需要大量工作。我想让它变得更通用,但我真的不知道该怎么做。我用谷歌搜索过这个但什么也没找到。有人知道此类问题的解决方案/已知模式吗?
我可以像这样重新表述问题:我如何通过反射调用以下方法:
void SomeMethod(unknowntypeatcompiletime param);
Run Code Online (Sandbox Code Playgroud)
其中unknowntypeatcompiletime可以是任何东西。
没有直接的方法可以让随机发生器适用于任何可能的类型。
根据您想要实现的目标,您可能会发现一些 Mock 和 TDD 框架(例如 Moq 或 AutoFixture)很有用(后者可以使用随机数据创建对象)。他们创建了无论如何模拟的对象,并且他们可以随机化到什么程度仍然是一个悬而未决的问题。
另一种方法是在应用程序外部的文件中添加某种值种子。该种子文件可以包含可能类型的对象图,其中之一是随机选择的。该文件可以在运行时加载,因此不需要重新编译。然而,此解决方案要求您在想要支持新类型时立即扩展种子。