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