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

时间:2017-08-03 09:11:04

标签: c# methods parameter-passing optional-parameters

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

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

4 个答案:

答案 0 :(得分:5)

如果方法中所需的所有参数值都是相同的类型(让它为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);

答案 1 :(得分: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
    // ...
}

如果已知属性,则创建类并为其指定属性。

答案 2 :(得分:1)

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

首先:使用字典

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

由于您定义了此Object,因此您可以在以下方法中使用它:

myMethod(ParameterObject parameter){

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

}

答案 3 :(得分:1)

您可以使用建议的字典,并使方法调用者从字典中构建参数数组,并从传入的实例中调用该方法。

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

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