如何将参数作为单个对象传递?

How to pass parameters as a single object?

我有这个例子来告诉你我在找什么:

private void myMethod(string a = "", string b = "", string c = "")
{
   // do things
}

我想找到一种可以像这样调用该方法的方法:

MyParameterObject parameters = new MyParameterObject();
// b is the name of parameter
parameters.AddParameter("b", "b_value");
parameters.AddParameter("c", "c_value");
myMethod(parameters);

如果方法中需要的所有参数值都是同一类型(设为 string),那么您可以将参数作为 Dictionary 传递,如下所示:

private void myMethod(Dictionary<string,string> paramDictionary)
{
   // do things
}

这样你就可以像这样调用方法:

Dictionary<string,string> paramDictionary = new Dictionary<string,string>();
paramDictionary.Add("b", "b_value");
paramDictionary.Add("c", "c_value");
myMethod(paramDictionary);

创建键值对并将其传递给函数

List<KeyValuePair<string, string>> kvpList = new List<KeyValuePair<string, string>>()
{
    new KeyValuePair<string, string>("a", "a_value"),
    new KeyValuePair<string, string>("b", "b_value"),
    new KeyValuePair<string, string>("c", "c_value"),
};


public void myMethod(KeyValuePair<string, string>[] pairs)
{
    // Read key value pair
    // ...
}

如果已知属性,则创建 class 并为其分配属性。

正如其他人所描述的那样,我们真的不知道您的问题是什么,但有两种可能性。

首先:使用字典

Dictionary<string,string> paramDictionary = new Dictionary<string,string>();
paramDictionary.Add("b", "b_value");
paramDictionary.Add("c", "c_value");
myMethod(paramDictionary);

第二:创建适合您需要的对象

public class ParameterObject{

  private string firstName, lastName;
  public string FirstName { get { return firstName; } set { firstName = value; } }
  public string LastName { get { return lastName; } set { lastName = value; } }    
  // and so on

  public ParameterObject(){
    // leave it empty or create it with parameters
  }

}

然后像您的示例一样使用它:

ParameterObject parameters = new ParameterObject();
parameters.setFirstName("b_value");
parameters.setLastName("c_value");
myMethod(parameters);

既然你定义了这个对象,你就可以在这样的方法中使用它:

myMethod(ParameterObject parameter){

String firstName = parameter.getFirstName();
String lastName = parameter.getLastName();

}

您可以像建议的那样使用字典并制作一个方法调用程序来从字典构建参数数组并从传入的实例调用方法。

public static class Invoker
{
    public static void Invoke<TClass>(string methodName, Dictionary<string, object> myParameterObject, TClass instance)
    {
        var method = typeof(TClass).GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance);
        var parameters = method.GetParameters().Select(parameter => myParameterObject.ContainsKey(parameter.Name) ? myParameterObject[parameter.Name] : null).ToArray();

        method.Invoke(instance, parameters);
    }
}

然后这样称呼它

var parameters = new Dictionary<string, object> { { "b", "b_value" }, { "c", "c_value" } };

var myClass = new MyClass(); 
Invoker.Invoke("MyMethod", parameters, myClass);
Console.ReadKey();

假设您的 MyClass 将包含 MyMethod

public class MyClass
{
    private void MyMethod(string a = "", string b = "", string c = "")
    {
        Console.WriteLine("a : " + a + " b : " + b + " c : " + c);
    }
}

虽然这很容易出错,但作为反思技巧的练习很有用。