C# 有没有办法像这样使用动态场?

C# 有没有办法像这样使用动态场?,c#,dynamic,reflection,C#,Dynamic,Reflection,我所做的是通过反射调用方法。在调用某个方法之前,让我们假设它的名称将是FooMethod,我需要创建这个参数的参数类型,我只知道在运行时。所以我想用dynamicfield来传递参数的值 例如: 使用: 目前我得到的例外情况是: 问题: 我该怎么做?是否有一种方法允许在不创建字典的情况下通过索引检查此值?尝试使用ExpandoObject而不是dynamic。您无法为其编制索引,但无法创建词典 public void Execute(string methodName, ExpandoO

我所做的是通过反射调用方法。在调用某个方法之前,让我们假设它的名称将是FooMethod,我需要创建这个参数的参数类型,我只知道在运行时。所以我想用dynamicfield来传递参数的值

例如:

使用:

目前我得到的例外情况是:

问题:
我该怎么做?是否有一种方法允许在不创建字典的情况下通过索引检查此值?

尝试使用ExpandoObject而不是dynamic。您无法为其编制索引,但无法创建词典

    public void Execute(string methodName, ExpandoObject values)
    {
        // ...

        if(values.Any(x => x.Key == methodParameterProperties[0].Name))
        {
            var value = values.First(x => x.Key == methodParameterProperties[0].Name).Value;
             // build argument here (based on value)

        }
    }

您将一个匿名类的实例(带有单个字段SomeField)分配给,然后尝试将其作为数组进行索引。那是行不通的

然而,MethodInfo.Invoke接受对象数组作为参数,所以这里根本不需要动态。将values参数的类型更改为object[],并将其传递给Invoke。因此:

您还可以将参数说明符添加到参数中,以便调用它,如:

Execute(someObject, "someObjectMethod", arg1, arg2, arg3);

您需要确保传入的参数类型正确,否则Invoke将抛出ArgumentException。此外,如果给定对象没有具有给定名称的方法,则GetMethod将返回null。您可能还需要检查该方法所使用的参数数量,这取决于您打算如何以及在何处使用此代码。

什么是FooMethod?为什么不使用params而不是dynamic?我使用经典反射而不是dynamic。
Cannot apply indexing with [] to an expression of type 'object'
    public void Execute(string methodName, ExpandoObject values)
    {
        // ...

        if(values.Any(x => x.Key == methodParameterProperties[0].Name))
        {
            var value = values.First(x => x.Key == methodParameterProperties[0].Name).Value;
             // build argument here (based on value)

        }
    }
public class MyClass
{
    public void MyMethod(string s)
    {
    }
}

public object Execute(object obj, string methodName, object[] arguments)
{
    Type type = obj.GetType();
    MethodInfo methodInfo = type.GetMethod(methodName);
    return methodInfo.Invoke(obj, arguments);
}
Execute(someObject, "someObjectMethod", arg1, arg2, arg3);