在不知道参数类型的情况下为方法生成随机参数值

Bal*_*kas 5 c#

我想解决什么问题?通过反射,我想执行代码(运行实例方法和静态方法),其中我事先不知道如何定义要运行的方法。

假设我有一个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可以是任何东西。

Edi*_*din 0

没有直接的方法可以让随机发生器适用于任何可能的类型。

根据您想要实现的目标,您可能会发现一些 Mock 和 TDD 框架(例如 Moq 或 AutoFixture)很有用(后者可以使用随机数据创建对象)。他们创建了无论如何模拟的对象,并且他们可以随机化到什么程度仍然是一个悬而未决的问题。

另一种方法是在应用程序外部的文件中添加某种值种子。该种子文件可以包含可能类型的对象图,其中之一是随机选择的。该文件可以在运行时加载,因此不需要重新编译。然而,此解决方案要求您在想要支持新类型时立即扩展种子。