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

4

我有一个例子,用来说明我正在寻找的内容:

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);

List<MyParameterObject> - Liam
1
只需要定义一个可以容纳3个字符串的对象,有什么问题吗? - Nico
我猜 @Nico,参数的数量是可变的变量? - Liam
类似这样,但我想传递特定参数名称的值。根据您的建议,我无法定义您的列表中将分配哪个参数(a、b或c)的值。 - Adnand
我不知道那是什么意思? - Liam
字典是我用来传递多个参数并返回多个名称/值对的工具。 - dipak
4个回答

6
如果方法中需要的所有参数值都是同一类型(例如 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);

3
创建键值对并将其传递给函数。
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
    // ...
}

如果已知属性,则创建类并将属性分配给它。

我想强调最后一句话,那是最好的解决方案(如果属性确实已知)。 - EpicKip

2
正如其他人所描述的那样,我们并不知道您的问题是什么,但有两种可能性。
第一种:使用字典。
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();

}

@un-lucky 提出的字典是最好的选择,也感谢您的建议。 - Adnand

2
您可以像建议的那样使用字典,并创建一个方法调用器,从字典中构建参数数组,并从传入的实例中调用该方法。
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);
    }
}

尽管这种方法容易出现错误,但对于反思技巧的培养非常有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接